Mam ramkę danych, która ma jeden wiersz i kilka kolumn. Niektóre z kolumn są pojedynczymi wartościami, a inne są listami. Wszystkie kolumny listy mają tę samą długość. Chcę podzielić każdą kolumnę listy do osobnego wiersza, zachowując dowolną kolumnę bez listy.Pyspark: Podział wielu kolumn tablicy na wiersze
próbki 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|
# +---+---------+---------+---+
Czego chcę:
+---+---+----+------+
| a| b| c | d |
+---+---+----+------+
| 1| 1| 7 | foo |
| 1| 2| 8 | foo |
| 1| 3| 9 | foo |
+---+---+----+------+
Gdybym miał tylko jedną kolumnę listy, to byłoby proste po prostu robi explode
:
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|
# +---+---+---------+---+
Jednak jeśli spróbuję również explode
kolumna , otrzymam danef Rame o długości kwadrat, czego chcę:
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|
# +---+---+---+---+
Co chcę jest - dla każdej kolumny, wziąć n-ty element tablicy w tej kolumnie i dodać, że do nowego wiersza. Próbowałem mapowania eksplodować po drugiej stronie wszystkich kolumn w dataframe, ale to nie wydają się działać albo:
df_split = df.rdd.map(lambda col: df.withColumn(col, explode(col))).toDF()