首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有groupby的pyspark collect_set或collect_list

带有groupby的pyspark collect_set或collect_list
EN

Stack Overflow用户
提问于 2016-06-02 08:17:59
回答 2查看 112.1K关注 0票数 62

groupby之后,如何在数据帧上使用collect_setcollect_list。例如:df.groupby('key').collect_set('values')。我得到一个错误:AttributeError: 'GroupedData' object has no attribute 'collect_set'

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-28 05:01:51

您需要使用agg。示例:

代码语言:javascript
复制
from pyspark import SparkContext
from pyspark.sql import HiveContext
from pyspark.sql import functions as F

sc = SparkContext("local")

sqlContext = HiveContext(sc)

df = sqlContext.createDataFrame([
    ("a", None, None),
    ("a", "code1", None),
    ("a", "code2", "name2"),
], ["id", "code", "name"])

df.show()

+---+-----+-----+
| id| code| name|
+---+-----+-----+
|  a| null| null|
|  a|code1| null|
|  a|code2|name2|
+---+-----+-----+

注意,在上面的代码中,您必须创建一个HiveContext。请参阅https://stackoverflow.com/a/35529093/690430,了解如何处理不同的Spark版本。

代码语言:javascript
复制
(df
  .groupby("id")
  .agg(F.collect_set("code"),
       F.collect_list("name"))
  .show())

+---+-----------------+------------------+
| id|collect_set(code)|collect_list(name)|
+---+-----------------+------------------+
|  a|   [code1, code2]|           [name2]|
+---+-----------------+------------------+
票数 120
EN

Stack Overflow用户

发布于 2019-10-01 15:28:32

如果你的数据帧很大,你可以尝试使用pandas udf(GROUPED_AGG)来避免内存错误。它的速度也快得多。

分组聚合Pandas UDF类似于Spark聚合函数。分组聚合Pandas UDF与groupBy()、.agg()和pyspark.sql.Window一起使用。它定义了从一个或多个pandas.Series到标量值的聚合,其中每个pandas.Series表示组或窗口中的一列。pandas udf

示例:

代码语言:javascript
复制
import pyspark.sql.functions as F

@F.pandas_udf('string', F.PandasUDFType.GROUPED_AGG)
def collect_list(name):
    return ', '.join(name)

grouped_df = df.groupby('id').agg(collect_list(df["name"]).alias('names'))
票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37580782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档