[英]pyspark: dataframe from rdd containing list of lists
我是 Spark(使用 Python)的新手,即使在浏览了相关帖子后也无法弄清楚这一点。
我有一个 RDD。 RDD的每条记录都是如下列表的列表
[[1073914607, 0, -1],[1073914607, 2, 7.88],[1073914607, 0, -1],[1073914607, 4, 40.0]]
[[1074079003, 0, -1],[1074079003, 2, 2.87],[1074079003, 0, -1],[1074079003, 4, 35.2]]
我想将 RDD 转换为具有 3 列的 dataframe,基本上堆叠所有元素列表。 dataframe 应如下所示。
account_id product_id price
1073914607 0 -1
1073914607 2 7.88
1073914607 0 -1
1073914607 4 40
1074079003 0 -1
1074079003 2 2.87
1074079003 0 -1
1074079003 4 35.2
我试过my_rdd.toDF()
,但它给了我两行和四列,每个元素列表在一列中。 我还尝试了其他帖子中建议的一些可能相关的解决方案。 由于我是 spark 的新手,所以我遇到了各种我可以弄清楚的错误。 请帮忙。 谢谢。
添加于 07/28/2021 。 最后我做了以下循环遍历每个元素并生成一个长列表并将其转换为 dataframe。可能这不是最有效的方法但它解决了我的问题。
result_lst=[]
for x in my_rdd.toLocalIterator():
for y in x:
result_lst.append(y)
result_df=spark.createDataFrame(result_lst, ['account_id','product_id','price'])
>>> data = ([[1,2],[1,4]],[[2,5],[2,6]])
>>> df = sc.parallelize(data).toDF(['c1','c2'])
>>> df.show()
+------+------+
| c1| c2|
+------+------+
|[1, 2]|[1, 4]|
|[2, 5]|[2, 6]|
+------+------+
>>> df1 = df.select(df.c1.alias('c3')).union(df.select(df.c2).alias('c3'))
>>> df1.show()
+------+
| c3|
+------+
|[1, 2]|
|[2, 5]|
|[1, 4]|
|[2, 6]|
+------+
>>> df1.select(df1.c3,df1.c3[0],df1.c3[1]).show()
+------+-----+-----+
| c3|c3[0]|c3[1]|
+------+-----+-----+
|[1, 2]| 1| 2|
|[2, 5]| 2| 5|
|[1, 4]| 1| 4|
|[2, 6]| 2| 6|
+------+-----+-----+
后来我用下面的另一种方式解决了这个问题,没有将rdd带入Localiterator()并循环遍历。 我想这种新方法效率更高。
from pyspark.sql.functions import explode
from pyspark.sql import Row
df_exploded=my_rdd.map(lambda x : Row(x)).toDF().withColumn('_1', explode('_1'))
result_df=df_exploded.select([df_exploded._1[i] for i in range(3)]).toDF('account_id','product_id','price')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.