0

我正在使用以下命令在第一次爆炸后进行第二次爆炸:

myExplode = sqlContext.sql("select explode(names) as name_x from myTable")
myExplode = sqlContext.sql("select explode(name_x) as name1 from myTable")
myExplode.show(6,False)

然后我得到了错误: u"cannot resolve 'name_x' given input columns: [names, fieldA, fieldB, fieldC]; line 1 pos 15"

但是,第一次爆炸效果很好。我在第二次爆炸中做错了什么吗?


这是一个例子:

+---------------------------------------------------------------------------------+
|names                                                                            |
+---------------------------------------------------------------------------------+
|[[[Max,White,WrappedArray(SanDiego)],3], [[Spot,Black,WrappedArray(SanDiego)],2]]|
|[[[Michael,Black,WrappedArray(SanJose)],1]]                                      |
+---------------------------------------------------------------------------------+

第一次爆炸后,我得到:

+-----------------------------------------+
|name_x                                   |
+-----------------------------------------+
|[[Max,Black],3]                          |
|[[Spot,White],2]                         |
|[[Michael,Yellow],1]                     |
+-----------------------------------------+

我现在想在 name_x 上进行第二次爆炸,这样我可以得到 [Max,Black]、[Spot, White] 和 [Michael, Yellow]。在此之后,我什至想做第三次爆炸,这样我就可以只得到 Max、Spot 和 Michael 并将它们放在一个新列中。这有可能吗?

谢谢!

4

1 回答 1

2

你不想explodes在第一个之后。您只是选择了部分数据。Explode 采用单行并基于该行创建更多行。这正是你的第一次爆炸所做的,这是正确的。对于第二次和后续的转换,您不是在创建新行,而是在创建新列。withColumn您可以使用或使用创建新列select

在您的情况下,您正在尝试访问StructType. 要访问 a 中的各个字段StructType,请使用getField. 就像是:

`df.withColumn("newColumn", $"name_x".getField("fieldName"))

你必须弄清楚fieldName要使用什么——如果你不确定,就printSchema在你的身上使用DataFrame并达到顶峰。

于 2016-04-26T11:45:38.923 回答