如何在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
相关产品推荐
相关产品推荐

