首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL的GROUP_CONCAT聚合函数的Spark SQL替换

MySQL的GROUP_CONCAT聚合函数的Spark SQL替换
EN

Stack Overflow用户
提问于 2015-07-27 02:55:37
回答 7查看 46.4K关注 0票数 40

我有一个包含两个字符串类型列的表(username, friend),对于每个用户名,我希望将它的所有朋友收集在一行上,并以字符串的形式连接起来。例如:('username1', 'friends1, friends2, friends3')

我知道MySQL和GROUP_CONCAT就是这么做的。有没有办法用Spark SQL做到这一点?

EN

回答 7

Stack Overflow用户

发布于 2016-02-16 17:24:02

您可以尝试使用collect_list函数

代码语言:javascript
复制
sqlContext.sql("select A, collect_list(B), collect_list(C) from Table1 group by A

或者您可以注册UDF,如下所示

代码语言:javascript
复制
sqlContext.udf.register("myzip",(a:Long,b:Long)=>(a+","+b))

您可以在查询中使用此函数

代码语言:javascript
复制
sqlConttext.sql("select A,collect_list(myzip(B,C)) from tbl group by A")
票数 21
EN

Stack Overflow用户

发布于 2019-12-25 03:23:24

在Spark 2.4+中,这在collect_list()array_join()的帮助下变得更加简单。

下面是一个用PySpark编写的演示,不过代码应该与Scala非常相似:

代码语言:javascript
复制
from pyspark.sql.functions import array_join, collect_list

friends = spark.createDataFrame(
    [
        ('jacques', 'nicolas'),
        ('jacques', 'georges'),
        ('jacques', 'francois'),
        ('bob', 'amelie'),
        ('bob', 'zoe'),
    ],
    schema=['username', 'friend'],
)

(
    friends
    .orderBy('friend', ascending=False)
    .groupBy('username')
    .agg(
        array_join(
            collect_list('friend'),
            delimiter=', ',
        ).alias('friends')
    )
    .show(truncate=False)
)

输出:

代码语言:javascript
复制
+--------+--------------------------+
|username|friends                   |
+--------+--------------------------+
|jacques |nicolas, georges, francois|
|bob     |zoe, amelie               |
+--------+--------------------------+

这类似于MySQL的GROUP_CONCAT()和Redshift的LISTAGG()

票数 13
EN

Stack Overflow用户

发布于 2018-04-07 01:49:57

下面是您可以在PySpark中使用的函数:

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

def group_concat(col, distinct=False, sep=','):
    if distinct:
        collect = F.collect_set(col.cast(StringType()))
    else:
        collect = F.collect_list(col.cast(StringType()))
    return F.concat_ws(sep, collect)


table.groupby('username').agg(F.group_concat('friends').alias('friends'))

在SQL中:

代码语言:javascript
复制
select username, concat_ws(',', collect_list(friends)) as friends
from table
group by username
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31640729

复制
相关文章

相似问题

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