使用不带Pandas DataFrame的方法将Spark DataFrame转换为元组列表

5

我有一个现有的逻辑,可以将pandas数据框转换为元组列表。

list(zip(*[df[c].values.tolist() for c in df])) 

其中df是一个pandas数据帧。

请有人帮助我在pyspark中实现相同的逻辑,而不使用pandas。


我不清楚pandas和spark之间的关系,也不知道你为什么提到它。 - 89f3a1c
df 是通过调用 spark dataframe 上的 toPandas() 方法创建的,我想直接将 spark dataframe 转换为元组列表。 - Corey
2个回答

5
您可以首先使用 rdd 方法将 dataframe 转换为 RDD。 数据框中的 Row 也是一个 tuple,因此您可以直接这样操作:
rdd = df.rdd
b = rdd.map(tuple)
b.collect()

示例 DF:

df.show()
+-----+-----+
| Name|Score|
+-----+-----+
|name1|11.23|
|name2|14.57|
|name3| 2.21|
|name4| 8.76|
|name5|18.71|
+-----+-----+

b.collect() 之后
[('name1', 11.23), ('name2', 14.57), ('name3', 2.21), ('name4', 8.76), ('name5', 18.71)]

编辑

如果你要循环遍历这个元组列表,你可以调用collect()方法,但正确的方法是toLocalIterator()


我喜欢你的解决方案,我们可以不用collect来完成吗? - Corey
1
@Thomas collect仅用于向您显示输出。该解决方案可以在不使用collect的情况下正常工作。 - pissall
我有另一种方法,它期望元组列表作为输入,但如果我将b传递给它,它将无法工作,因为b仍然是RDD。 - Corey
@Thomas 我扩展了我的回答。 - pissall

2

一种不使用collect,而是使用collect_list的替代方案

import pyspark.sql.functions as F

df.show()
+-----+-----+
| Name|Score|
+-----+-----+
|name1|11.23|
|name2|14.57|
|name3| 2.21|
|name4| 8.76|
|name5|18.71|
+-----+-----+

@F.udf
def combo(*args):
  return [_ for _ in args][0]

df.withColumn('Combo', combo(F.array('Name','Score'))).agg(F.collect_list('Combo')).show(truncate=False)

+--------------------------------------------------------------------------+
|collect_list(Combo)                                                       |
+--------------------------------------------------------------------------+
|[[name1, 11.23],[name2, 14.57],[name3, 2.21],[name4, 8.76],[name5, 18.71]]|
+--------------------------------------------------------------------------+




网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接