csv 的 pyspark rdd 到具有大量列的动态数据框
pyspark rdd of csv to data frame with large number of columns dynamically
我有一个现有的 rdd,它由一列文本和许多 (20k+) 逗号分隔值组成。
如何在不逐字指定每一列的情况下将其转换为数据框?
# split into columns
split_rdd = input_rdd.map(lambda l: l.split(","))
# convert to Row types
rows_rdd = split_rdd.map(lambda p: Row(
field_1=p[0],
field_2=p[1],
field_3 = float(p[2]),
field_4 = float(p[3])
))
df = spark.createDataFrame(rows_rdd)
如何动态创建
field_1=p[0],
字典?
例如
row_dict = dict(
field_1=p[0],
field_2=p[1],
field_3 = float(p[2]),
field_4 = float(p[3])
)
是无效的语法,因为 'p[0]' 需要被引用,但它是一个文字,不会在 lambda 函数中计算。
这是一个足够大的数据集,我需要避免写出 rdd 并将其读回数据帧以提高性能。
您可以尝试在创建行实例时使用字典理解:
df = split_rdd\
.map(lambda p: {'field_%s' % index : val
for (index, val) in enumerate(p)})\
.map(lambda p: Row(**p))\
.toDF()
这是首先将列表列值数组从 split_rdd
映射到一个字典中,其中动态生成的 field_N
键映射到相应的值。这些字典随后用于创建 Row
个实例。
我有一个现有的 rdd,它由一列文本和许多 (20k+) 逗号分隔值组成。
如何在不逐字指定每一列的情况下将其转换为数据框?
# split into columns
split_rdd = input_rdd.map(lambda l: l.split(","))
# convert to Row types
rows_rdd = split_rdd.map(lambda p: Row(
field_1=p[0],
field_2=p[1],
field_3 = float(p[2]),
field_4 = float(p[3])
))
df = spark.createDataFrame(rows_rdd)
如何动态创建
field_1=p[0],
字典?
例如
row_dict = dict(
field_1=p[0],
field_2=p[1],
field_3 = float(p[2]),
field_4 = float(p[3])
)
是无效的语法,因为 'p[0]' 需要被引用,但它是一个文字,不会在 lambda 函数中计算。
这是一个足够大的数据集,我需要避免写出 rdd 并将其读回数据帧以提高性能。
您可以尝试在创建行实例时使用字典理解:
df = split_rdd\
.map(lambda p: {'field_%s' % index : val
for (index, val) in enumerate(p)})\
.map(lambda p: Row(**p))\
.toDF()
这是首先将列表列值数组从 split_rdd
映射到一个字典中,其中动态生成的 field_N
键映射到相应的值。这些字典随后用于创建 Row
个实例。