将Spark数据框转换为不包含Pandas数据框的元组列表

时间:2019-10-14 21:43:47

标签: apache-spark pyspark pyspark-dataframes

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

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

其中df是熊猫数据框。

请有人帮我实现pyspark中没有熊猫的相同逻辑。

2 个答案:

答案 0 :(得分:0)

您可以先使用dataframe方法将RDD转换为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()

答案 1 :(得分:0)

没有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]]|
+--------------------------------------------------------------------------+