将 pandas 转换为 pyspark 表达式
Posted
技术标签:
【中文标题】将 pandas 转换为 pyspark 表达式【英文标题】:turning pandas to pyspark expression 【发布时间】:2016-10-22 16:24:13 【问题描述】:我需要将两列数据框转换为按其中一列分组的列表。我已经在 pandas 中成功完成了:
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 文档不包含类似的内容。
它的示例输入是数据框:
session name
1 a
1 b
2 v
2 c
输出:
session name
1 [a, b....]
2 [v, c....]
【问题讨论】:
能否分享示例数据和预期输出? @mtoto 是的,确定,完成! 试试这个:from pyspark.sql.functions import *; df.groupBy('session').agg(collect_list('name'))
【参考方案1】:
你也可以使用pyspark.sql.functions.collect_list(col)函数:
from pyspark.sql.functions import *
df.groupBy('session').agg(collect_list('name'))
【讨论】:
【参考方案2】:您可以使用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"])
【讨论】:
以上是关于将 pandas 转换为 pyspark 表达式的主要内容,如果未能解决你的问题,请参考以下文章