2016-08-03 7 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

これは、Spark 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

私はちょうど編集していましたが、それは奇妙です。使うことができます *。たぶん、いくつかのバージョンの問題? –

1

簡単な方法は、SQLを使用することです、あなたはのようなフラットなものネストされた列の別名するSQLクエリ文字列を構築することができ。

  1. 取得データフレームスキーマ(df.schema())
  2. はSQL (用(フィールドにスキーマを変換:スキーマ()フィールド())...
  3. クエリ「ヴァルnewDF Javaで= sqlContext.sql( "ソースからの" + sqlGenerated + "SELECT")

例:

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

(私はSQLの方が好きなので、Spark-shellで簡単にテストすることができますし、クロスランゲージです)。

関連する問題