我需要将两列Dataframe转换为按其中一列分组的列表。我在熊猫中成功完成了它:
expertsDF = expertsDF.groupby('session', as_index=False).agg(lambda x: x.tolist())
但是现在我想在pySpark中做同样的事情如下:
expertsDF = df.groupBy('session').agg(lambda x: x.collect())
我收到错误:
all exprs should be Column
我尝试了几个命令,但我根本无法做到。并且spark dokumentation不包含类似的东西。
它的示例输入是数据帧:
session name
1 a
1 b
2 v
2 c
输出:
session name
1 [a, b....]
2 [v, c....]
答案 0 :(得分:7)
您还可以使用pyspark.sql.functions.collect_list(col)功能:
from pyspark.sql.functions import *
df.groupBy('session').agg(collect_list('name'))
答案 1 :(得分:1)
您可以使用reduceByKey()
来有效地执行此操作:
(df.rdd
.map(lambda x: (x[0],[x[1]]))
.reduceByKey(lambda x,y: x+y)
.toDF(["session", "name"]).show())
+-------+------+
|session| name|
+-------+------+
| 1|[a, b]|
| 2|[v, c]|
+-------+------+
数据强>:
df = sc.parallelize([(1, "a"),
(1, "b"),
(2, "v"),
(2, "c")]).toDF(["session", "name"])