2016-08-03 15 views
8

Ich habe einen Datenrahmen mit der folgenden Struktur:Wie eine Struktur in einem Funkendatenrahmen zu glätten?

|-- 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) 

Wie es möglich ist, die Struktur zu glätten und einen neuen Datenrahmen erstellen:

 |-- 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) 

Gibt es so etwas wie explodieren, aber für structs?

+0

Die Antworten auf https://stackoverflow.com/questions/37471346/automatically-and-elegantly-flatten-dataframe-in-spark-sql waren ebenfalls hilfreich. – erwaman

Antwort

21

Das Spark 1.6 funktionieren sollte oder später:

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

oder

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

Exception in thread "main" org.apache.spark.sql.AnalysisException: No such struct Feld * – djWann

+0

aber mit select auf alle Spalten wie df.select (df.col1, df.col2, df.col3) arbeitet, so Ich werde diese Antwort akzeptieren – djWann

+0

Ich habe gerade bearbeitet, aber es ist seltsam. Ich kann nutzen *. Vielleicht ein Versions-Problem? –

1

Eine einfache Möglichkeit ist SQL zu verwenden, können Sie eine SQL-Query-String alias verschachtelt Spalte als flach bauen .

  1. Abrufen von Daten-Frame-Schema (df.schema())
  2. Transform Schema SQL (für (Feld. Schema() Felder()) ....
  3. Query „val newDF = sqlContext.sql ("SELECT" + sqlGenerated + "von der Quelle")

Ein Beispiel in Java:

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

(ich ziehe SQL Art und Weise, so dass Sie es leicht auf Spark-Schale testen und es ist Cross-Sprache).