我在第一次爆炸后使用以下命令进行第二次爆炸:
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,并将它们放入新的专栏中。这有可能吗?
谢谢!
答案 0 :(得分:2)
在第一个之后你不想要explodes
。您只是选择部分数据。爆炸占用一行,并根据该行创建更多行。这正是你的第一次爆炸所做的,这是正确的。对于第二次和后续转换,您不是在创建新行 - 您正在创建新列。您可以使用withColumn
或使用select
创建新列。
在您的情况下,您正试图在StructType
内获取嵌套数据。要访问StructType
中的各个字段,请使用getField
。类似的东西:
`df.withColumn("newColumn", $"name_x".getField("fieldName"))
您必须弄清楚要使用的fieldName
- 如果您不确定,只需在printSchema
上使用DataFrame
并达到高峰。