2017-02-22 8 views
0

Spark-Version 2.1Funke: Explode ein Paar von verschachtelten Spalten

ich eine Datei in Funken dataframe mit folgendem Format zu lesen:

{ 
    "field1": "value1", 
    "field2": "value2", 
    "elements": [{ 
     "id": "1", 
     "name": "a" 
    }, 
    { 
     "id": "2", 
     "name": "b" 
    }, 
    { 
     "id": "3", 
     "name": "c" 
    }] 
} 

Es enthält eine array von verschachtelten Elementen, jetzt will ich explode das elements Array, um die flache JSON-Struktur zu erhalten. Ich verwende den folgenden Code:

var dfExploded = df 
    .withColumn("id", 
     explode(df.col("elements.id"))) 
    .withColumn("name", 
     explode(df.col("elements.name"))); 

Es scheint kartesisches Produkt zurückkehrt (zum Beispiel ich bin 9 Elemente im Ergebnis zu erzielen, während ich nur 3 will). Gibt es eine Möglichkeit, ein Paar verschachtelte Spalten explode Funktion zu spezifizieren?

+0

vielleicht drehen Id + Namen glätten? –

Antwort

2

Wenn ich das richtig verstanden, würden Sie wollen, Sie dies versuchen:

val exploded = df.withColumn("elements", explode($"elements")) 
exploded.show() 
>> +--------+------+------+ 
>> |elements|field1|field2| 
>> +--------+------+------+ 
>> | [1,a]|value1|value2| 
>> | [2,b]|value1|value2| 
>> | [3,c]|value1|value2| 
>> +--------+------+------+ 

Dieser erste Schritt verwandelt sich im Grunde um das Array in separate Datensätze. Sie müssen es auf dem Array selbst tun (Elemente) eher als Elemente innerhalb

Weiter Sie tun können,

val flattened = exploded.select("elements.*", "field1", "field2") 
flattened.show() 
>> +---+----+------+------+ 
>> | id|name|field1|field2| 
>> +---+----+------+------+ 
>> | 1| a|value1|value2| 
>> | 2| b|value1|value2| 
>> | 3| c|value1|value2| 
>> +---+----+------+------+ 

die Elemente in Tupel

+0

Danke für Ihre Eingabe. Jetzt verstehe ich den Unterschied zwischen einzelnen 'explode' mit' select' und mehreren 'explode' Anrufen. Klappt wunderbar :) –