2016-04-25 139 views
0

后,我用下面的命令做的第一后第二爆炸爆炸:SparkSQL第二爆炸的第一爆炸

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

您正在对不存在的字段执行第二次爆炸。你期望它做什么? – eliasah

+0

,因为[names]列是数组的数组。所以在第一个爆炸打开外部数组后,我想打开第二个(内部)数组。谢谢! – Edamame

+0

发布示例数据集总是可以帮助其他人解决您的问题。 – dheee

回答

2

您不希望explodes在第一个之后。您只是选择部分数据。爆炸只需一行,并根据该行创建更多行。这正是你的第一次爆炸所做的,这是正确的。对于第二次和随后的转换,您不会创建新行 - 您正在创建新列。您可以使用withColumn或使用select创建一个新列。

在你的情况下,你试图获得StructType内的嵌套数据。要获得StructType中的单个字段,请使用getField。喜欢的东西:

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

你必须弄清楚什么fieldName使用 - 如果你不知道,只是使用printSchemaDataFrame,并采取一个高峰。

+0

谢谢。但问题实际上是元素没有字段名称。 [[Max,Black],3]只是一个元组。我试图做df.withColumn(“newColumn”,df.name_x.getField(_1)),但它不起作用。 fieldName不可用时如何获取信息?谢谢! – Edamame

+0

现在使用getField(“_ 1”)代替。谢谢! – Edamame