2016-04-25 208 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