2016-05-11 7 views
3

Ich habe einen Datenrahmen Spark-df mit folgendem Schema:bestimmte Spalten auswählen in Spark-Datenrahmen von Array von Struct

root 
|-- k: integer (nullable = false) 
|-- v: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- a: integer (nullable = false) 
| | |-- b: double (nullable = false) 
| | |-- c: string (nullable = true) 

Ist es möglich, nur wählen a, c in v von df ohne map zu tun? Insbesondere wird df aus einer Parquet-Datei geladen und ich möchte nicht, dass die Werte für c sogar geladen/gelesen werden.

Antwort

1

Es hängt genau davon ab, was Sie als Ausgabe erwarten, was aus Ihrer Frage nicht klar ist. Lass mich das klären. Sie können jedoch

df.select($"v.a",$"v.b").show() 

tun, was das Ergebnis sein kann, nicht Sie wollen, da v ein Array ist, wird es ein Array für eine und eine pro b ergeben. Was Sie wollen, können zu tun ist, explode das Array v wählen Sie dann aus der Explosionsdatenrahmen:

df.select(explode($"v").as("v" :: Nil)).select($"v.a", $"v.b").show() 

diese v auf eine Tabelle abflachen wird mit all seinen Werten abgeflacht. In jedem Fall sollte Spark/Parkett klug genug sein, Prädikat Push-Down und nicht laden c überhaupt zu verwenden.