将csv的pyspark rdd动态地添加到具有大量列的数据帧中

时间:2018-03-29 16:56:00

标签: apache-spark pyspark spark-dataframe rdd

我有一个现有的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并将其读回数据帧以获得性能。

1 个答案:

答案 0 :(得分:0)

您可以尝试在创建行实例时使用字典理解:

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