2016-08-03 26 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上测试它,它是跨语言的)。