把熊猫变成pyspark表达

Kra*_*tos 5 python group-by pandas apache-spark pyspark

我需要将两列Dataframe转换为按其中一列分组的列表.我在熊猫中成功完成了它:

expertsDF = expertsDF.groupby('session', as_index=False).agg(lambda x: x.tolist())
Run Code Online (Sandbox Code Playgroud)

但是现在我想在pySpark中做同样的事情如下:

expertsDF = df.groupBy('session').agg(lambda x: x.collect())
Run Code Online (Sandbox Code Playgroud)

我收到错误:

all exprs should be Column
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几个命令,但我根本无法做到正确.并且spark dokumentation不包含类似的东西.

它的示例输入是数据帧:

session     name
1           a
1           b
2           v
2           c
Run Code Online (Sandbox Code Playgroud)

输出:

session    name
1          [a, b....]
2          [v, c....] 
Run Code Online (Sandbox Code Playgroud)

Max*_*axU 7

您还可以使用pyspark.sql.functions.collect_list(col)函数:

from pyspark.sql.functions import *

df.groupBy('session').agg(collect_list('name'))
Run Code Online (Sandbox Code Playgroud)


mto*_*oto 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]|
+-------+------+
Run Code Online (Sandbox Code Playgroud)

数据

df = sc.parallelize([(1, "a"),
                     (1, "b"),
                     (2, "v"),
                     (2, "c")]).toDF(["session", "name"])
Run Code Online (Sandbox Code Playgroud)