我正在尝试将rdd转换为没有任何架构的数据帧。 我试过下面的代码。它工作正常,但数据框列正在洗牌。
def f(x):
d = {}
for i in range(len(x)):
d[str(i)] = x[i]
return d
rdd = sc.textFile("test")
df = rdd.map(lambda x:x.split(",")).map(lambda x :Row(**f(x))).toDF()
df.show()
答案 0 :(得分:1)
如果您不想指定架构,请不要在RDD中转换使用Row
。如果您只是正常RDD
(而不是RDD[Row]
),则可以直接使用toDF()
。
df = rdd.map(lambda x: x.split(",")).toDF()
您也可以使用toDF()
为列添加名称,
df = rdd.map(lambda x: x.split(",")).toDF("col1_name", ..., "colN_name")
如果你拥有的是RDD[Row]
,你需要真正了解每列的类型。这可以通过指定模式或如下来完成
val df = rdd.map({
case Row(val1: String, ..., valN: Long) => (val1, ..., valN)
}).toDF("col1_name", ..., "colN_name")