You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在sparklyr环境中按列分组并拼接另一列的值?

在sparklyr中按分组拼接列值为列表的解决方案

在本地R环境中,你可以用paste0(cyl, collapse = ";")实现分组拼接字符串,但这套代码直接搬到sparklyr里会触发SQL解析错误——因为sparklyr会尝试将collapse参数翻译成Spark SQL语法,而Spark本身不支持这个参数。

方法1:生成去重的列表(对应PySpark的collect_set)

sparklyr中直接提供了和PySpark对应的collect_set()函数,用于分组聚合时收集去重后的列值为列表:

# 将mtcars注册到Spark
sdf_copy_to(sc, x = mtcars, name = "mtcars_test")

# 分组收集去重的cyl值为列表
tbl(sc, "mtcars_test") %>%
  distinct(gear, cyl) %>%
  group_by(gear) %>%
  summarize(test_list = collect_set(cyl)) %>%
  show()

执行后输出类似:

gear test_list
    3 [8, 4, 6]
    4 [4, 6]
    5 [8, 4, 6]

方法2:生成分号分隔的字符串(和本地R输出一致)

如果需要和本地R一样的分号分隔字符串结果,可以用concat_ws()将collect_set()返回的列表拼接成字符串:

tbl(sc, "mtcars_test") %>%
  distinct(gear, cyl) %>%
  group_by(gear) %>%
  summarize(test_list = concat_ws(";", collect_set(cyl))) %>%
  show()

执行后输出类似:

gear test_list
    3     6;8;4
    4       6;4
    5     4;8;6

补充说明

  • collect_set():Spark原生聚合函数,返回去重且无序的元素集合
  • collect_list():如果不需要去重,可以用这个函数代替collect_set(),但因为你已经用了distinct(gear, cyl),两者效果一致
  • concat_ws(分隔符, 列):专门用于将数组/集合类型的列拼接成字符串,第一个参数是分隔符

内容的提问来源于stack exchange,提问作者Cyrus Mohammadian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:00:43