2016-04-21 8 views
1

Ich habe einen Funken Datenrahmen wie folgt aus:Wie flattere ich einen pySpark-Datenrahmen um eine Array-Spalte?

+------+--------+--------------+--------------------+ 
| dbn| boro|total_students|    sBus| 
+------+--------+--------------+--------------------+ 
|17K548|Brooklyn|   399|[B41, B43, B44-SB...| 
|09X543| Bronx|   378|[Bx13, Bx15, Bx17...| 
|09X327| Bronx|   543|[Bx1, Bx11, Bx13,...| 
+------+--------+--------------+--------------------+ 

Wie flattern ich es so, dass jede Zeile für jede für jedes Element in S-Bus kopiert wird, und S-Bus wird eine normale String-Spalte sein?

So würde das Ergebnis so aussehen:

+------+--------+--------------+--------------------+ 
| dbn| boro|total_students|    sBus| 
+------+--------+--------------+--------------------+ 
|17K548|Brooklyn|   399| B41    | 
|17K548|Brooklyn|   399| B43    | 
|17K548|Brooklyn|   399| B44-SB    | 
+------+--------+--------------+--------------------+ 

und so weiter ...

+1

Können Sie die erwartete Ausgabe bereitstellen? Erwarten Sie ein kartesisches Produkt zwischen 'sBus' und' sSw'? – zero323

+0

danke! hat das erwartete Ergebnis hinzugefügt. Der Einfachheit halber entfernt sSw Spalte –

+1

Nun, Sie können 'explode' verwenden (siehe zum Beispiel http://StackOverflow.com/q/36484385/1560062), aber es ist nicht so einfach, wenn Sie mehrere Spalten haben. – zero323

Antwort

2

ich nicht so denken kann, dies zu tun, ohne es in eine RDD zu drehen.

Der schwierige Teil besteht darin, die anderen Spalten zusammen mit den neu abgeflachten Werten zu halten. Ich tue dies, indem ich jede Zeile auf ein Tupel von (dict of other columns, list to flatten) abbilde und dann flatMapValues aufruft. Dadurch wird jedes Element der Werteliste in eine separate Zeile geteilt, aber halten Sie die Tasten angebracht, das heißt

(key, ['A', 'B', 'C']) 

wird

(key, 'A') 
(key, 'B') 
(key, 'C') 

Dann bewege ich das abgeflachte Wert wieder in das Wörterbuch von anderen Spalten und wandle es zurück in einen DataFrame um.

Verwandte Themen