【发布时间】:2020-06-23 13:57:55
【问题描述】:
我有以下格式讨厌的输入数据框:
from pyspark.sql import SparkSession
import pyspark.sql.functions as F
spark = SparkSession.builder.master("local").getOrCreate()
input_df = spark.createDataFrame(
[
('Alice;Bob;Carol',),
('12;13;14',),
('5;;7',),
('1;;3',),
(';;3',)
],
['data']
)
input_df.show()
# +---------------+
# | data|
# +---------------+
# |Alice;Bob;Carol|
# | 12;13;14|
# | 5;;7|
# | 1;;3|
# | ;;3|
# +---------------+
实际输入是以分号分隔的 CSV 文件,其中一列包含一个人的值。每个人可以有不同数量的值。这里,Alice 有 3 个值,Bob 只有一个,Carol 有 4 个值。
我想在 PySpark 中将其转换为一个输出数据框,该数据框为每个人保存一个数组,在此示例中,输出为:
result = spark.createDataFrame(
[
("Alice", [12, 5, 1]),
("Bob", [13,]),
("Carol", [14, 7, 3, 3])
],
['name', 'values']
)
result.show()
# +-----+-------------+
# | name| values|
# +-----+-------------+
# |Alice| [12, 5, 1]|
# | Bob| [13]|
# |Carol|[14, 7, 3, 3]|
# +-----+-------------+
我该怎么做?我想这将是F.arrays_zip()、F.split() 和/或F.explode() 的某种组合,但我想不通。
我目前被困在这里,这是我目前的尝试:
(input_df
.withColumn('splits', F.split(F.col('data'), ';'))
.drop('data')
).show()
# +-------------------+
# | splits|
# +-------------------+
# |[Alice, Bob, Carol]|
# | [12, 13, 14]|
# | [5, , 7]|
# | [1, , 3]|
# | [, , 3]|
# +-------------------+
【问题讨论】:
标签: python apache-spark pyspark pyspark-dataframes