Ich habe ein Datenframe, das eine Zeile und mehrere Spalten hat. Einige der Spalten sind Einzelwerte und andere sind Listen. Alle Listenspalten haben die gleiche Länge. Ich möchte jede Listenspalte in eine separate Zeile aufteilen und dabei jede Nicht-Listenspalte beibehalten.Pyspark: Split mehrere Array-Spalten in Zeilen
Probe DF:
df = sqlc.createDataFrame([Row(a=1, b=[1,2,3],c=[7,8,9], d='foo')])
# +---+---------+---------+---+
# | a| b| c| d|
# +---+---------+---------+---+
# | 1|[1, 2, 3]|[7, 8, 9]|foo|
# +---+---------+---------+---+
Was ich will:
+---+---+----+------+
| a| b| c | d |
+---+---+----+------+
| 1| 1| 7 | foo |
| 1| 2| 8 | foo |
| 1| 3| 9 | foo |
+---+---+----+------+
Wenn ich nur eine Liste Spalte hatte, dies einfach sein würde, nur um ein explode
tun:
df_exploded = df.withColumn('b', explode('b'))
# >>> df_exploded.show()
# +---+---+---------+---+
# | a| b| c| d|
# +---+---+---------+---+
# | 1| 1|[7, 8, 9]|foo|
# | 1| 2|[7, 8, 9]|foo|
# | 1| 3|[7, 8, 9]|foo|
# +---+---+---------+---+
Wenn ich jedoch auch versuchen, explode
die c
Spalte, ich am Ende mit einem Dataf Rame mit einer Länge auf den Platz, was ich will:
df_exploded_again = df_exploded.withColumn('c', explode('c'))
# >>> df_exploded_again.show()
# +---+---+---+---+
# | a| b| c| d|
# +---+---+---+---+
# | 1| 1| 7|foo|
# | 1| 1| 8|foo|
# | 1| 1| 9|foo|
# | 1| 2| 7|foo|
# | 1| 2| 8|foo|
# | 1| 2| 9|foo|
# | 1| 3| 7|foo|
# | 1| 3| 8|foo|
# | 1| 3| 9|foo|
# +---+---+---+---+
Was ich will, ist - für jede Spalte, nehmen Sie die n-te Element des Feldes in dieser Spalte und fügen hinzu, dass auf eine neue Zeile. Ich habe versucht, eine quer durch alle Spalten in dem Datenrahmen explodiert Abbildung, aber das scheint nicht zu funktionieren:
df_split = df.rdd.map(lambda col: df.withColumn(col, explode(col))).toDF()