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