2016-08-03 27 views
8

我有以下結構的數據幀:如何平鋪火花數據框中的結構?

|-- data: struct (nullable = true) 
| |-- id: long (nullable = true) 
| |-- keyNote: struct (nullable = true) 
| | |-- key: string (nullable = true) 
| | |-- note: string (nullable = true) 
| |-- details: map (nullable = true) 
| | |-- key: string 
| | |-- value: string (valueContainsNull = true) 

它是如何可能的扁平化結構,並創建一個新的數據框:

 |-- id: long (nullable = true) 
    |-- keyNote: struct (nullable = true) 
    | |-- key: string (nullable = true) 
    | |-- note: string (nullable = true) 
    |-- details: map (nullable = true) 
    | |-- key: string 
    | |-- value: string (valueContainsNull = true) 

有什麼樣爆炸,但結構?

+0

答案在https://stackoverflow.com/questions/37471346/automatically-and-elegantly-flatten-dataframe-in-spark-sql也有幫助。 – erwaman

回答

21

這應該星火1.6或更高版本的工作:

df.select(df.col("data.*")) 

df.select(df.col("data.id"), df.col("data.keyNote"), df.col("data.details")) 
+3

線程「main」中的異常org.apache.spark.sql.AnalysisException:沒有這樣的結構體字段* – djWann

+0

但在df.select(df.col1,df.col2,df.col3)等所有列上使用select工作,所以我會接受這個答案 – djWann

+0

我只是在編輯,但很奇怪。我可以用 *。也許有一些版本問題? – 2016-08-03 22:01:47

1

一個簡單的方法是使用SQL,你可以建立一個SQL查詢字符串別名嵌套列平者。

  1. 檢索數據幀模式(df.schema())
  2. 變換模式到SQL (對於(字段:模式()字段())....
  3. 查詢「VAL newDF = sqlContext.sql( 「選擇」 + sqlGenerated + 「FROM源」)

在Java中的一個例子:

https://gist.github.com/ebuildy/3de0e2855498e5358e4eed1a4f72ea48

(我更喜歡SQL方式,所以你可以很容易地在Spark-shell上測試它,它是跨語言的)。