2017-02-20 2 views
2

I haben derzeit ein Datenrahmen mit einer ID und einer Säule, die ein Array von Strukturen ist:Funken: Explodieren eines Datenrahmens Array von Strukturen und hängen ID

root 
|-- id: integer (nullable = true) 
|-- lists: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- text: string (nullable = true) 
| | |-- amount: double (nullable = true) 

Hier ist ein Beispiel-Tabelle mit Daten:

id | lists 
----------- 
1 | [[a, 1.0], [b, 2.0]] 
2 | [[c, 3.0]] 

Wie transformiere ich den obigen Datenrahmen in den unteren? Ich muss das Array "explodieren" und gleichzeitig die ID anhängen.

id | col1 | col2 
----------------- 
1 | a  | 1.0 
1 | b  | 2.0 
2 | c  | 3.0 

Herausgegeben Hinweis:

Hinweis es einen Unterschied unten zwischen den beiden Beispielen ist. Die erste enthält "eine Anordnung von Strukturen von Elementen". Während die später enthält nur "eine Reihe von Elementen".

root 
|-- id: integer (nullable = true) 
|-- lists: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- text: string (nullable = true) 
| | |-- amount: double (nullable = true) 


root 
|-- a: long (nullable = true) 
|-- b: array (nullable = true) 
| |-- element: long (containsNull = true) 
+1

Mögliche Duplikat [Abflachen Zeilen in Funken] (http://stackoverflow.com/questions/32906613/flattening-rows-in-spark) –

+0

Diese Frage hat einen einfacheren Datenrahmen, wobei die zweite Spalte nur ein Array ist. Meine unterscheidet sich, weil meine zweite Spalte ein "Array von Strukturen" ist. – Steve

Antwort

4

explode ist genau die Funktion:

import org.apache.spark.sql.functions._ 

df.select($"id", explode($"lists")).select($"id", $"col.text", $"col.amount") 
+0

Das funktioniert nicht ganz, denn nach der Explosion bekomme ich: (1, [a, 1.0]) \ n (1, | [b, 2.0]) \ n (2, [c, 3.0]) Das ist auf halbem Wege, aber ich muss die Liste auch in einzelne Spalten trennen. Ihr Code könnte für den einfachen Fall funktioniert haben, wenn es nur ein Array von Elementen ist, aber ich habe ein "Array von Strukturen" – Steve

+0

Ich habe einfach angewendet, was in der Lösung enthalten ist, es funktioniert genau wie von Steve erwartet. Es unterteilt die Liste in einzelne Spalten. Danke – Vezir

Verwandte Themen