Tôi có một khung dữ liệu có một hàng và một vài cột. Một số cột là các giá trị đơn và một số khác là danh sách. Tất cả các cột trong danh sách đều có cùng độ dài. Tôi muốn chia từng cột danh sách thành một hàng riêng biệt, trong khi vẫn giữ bất kỳ cột nào không phải danh sách.Pyspark: Chia nhiều cột mảng thành hàng
mẫu 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|
# +---+---------+---------+---+
Những gì tôi muốn:
+---+---+----+------+
| a| b| c | d |
+---+---+----+------+
| 1| 1| 7 | foo |
| 1| 2| 8 | foo |
| 1| 3| 9 | foo |
+---+---+----+------+
Nếu tôi chỉ có một cột danh sách, điều này sẽ được dễ dàng bởi chỉ cần làm một 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|
# +---+---+---------+---+
Tuy nhiên, nếu tôi cố gắng cũng explode
cột c
, tôi kết thúc bằng một thẻ dữ liệu Rame với chiều dài bình phương của những gì tôi muốn:
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|
# +---+---+---+---+
Những gì tôi muốn là - cho mỗi cột, lấy yếu tố thứ n của mảng trong cột đó và thêm rằng để một hàng mới. Tôi đã cố gắng lập bản đồ một nổ accross tất cả các cột trong dataframe, nhưng điều đó dường như không làm việc, hoặc:
df_split = df.rdd.map(lambda col: df.withColumn(col, explode(col))).toDF()