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 个实例。