mysql collect_set_spark sql concat_ws() collect_set() collect_list() 字段值拼接

spark sql collect_set、collect_list 、concat_ws都用来做字段拼接,其实和mysql中的字段拼接函数差不多,请参考Mysql中concat()、concat_ws()和 group_concat() 字段拼接的用法

1.concat_ws()函数

concat_ws()-CONCAT With Separator ,用分隔符来拼接字段

spark中concat_ws()和Mysql中一样,所以不多解释,

看源码/**

* Concatenates multiple input string columns together into a single string column,

* using the given separator.

*使用指定的分隔符将多个列拼接到单个字符串列中

*

* @group string_funcs

* @since 1.5.0

*/

@scala.annotation.varargs

def concat_ws(sep: String, exprs: Column*): Column = withExpr {

ConcatWs(Literal.create(sep, StringType) +: exprs.map(_.expr))

}

2.collect_set和collect_list

collect_set和collect_list,都是将分组后的单个列放到一个集合中

不同的是和java集合一样,Set不能存重复的值,是去重的,而list是不去重的/**

* Aggregate function: returns a list of objects with duplicates.

*聚合函数返回可重复的list对象

* @group agg_funcs

* @since 1.6.0

*/

def collect_list(e: Column): Column = withAggregateFunction { CollectList(e.expr) }

/**

* Aggregate function: returns a set of objects with duplicate elements eliminated.

*聚合函数返回去重后的set对象

* @group agg_funcs

* @since 1.6.0

*/

def collect_set(e: Column): Column = withAggregateFunction { CollectSet(e.expr) }

案例:df.groupBy("age").agg(collect_set("name")).show()

返回结果+---+-----------------+

|age|collect_set(name)|

+---+-----------------+

| 20|    [LI, Justin]|

| 19|      [Justin]|

| 29|     [Michael]|

| 30|        [Andy]|

+---+-----------------+

3.联合使用实现分组拼接字段

记得mysql 中的group_concat嘛,collect_list 、concat_ws联合使用就能实现分组拼接的效果sqlContext.sql("select concat_ws(',',collect_set(name)) as names from people group by age").show()

返回结果+---------+---+

|   names|age|

+---------+---+

|LI,Justin| 20|

|   Justin| 19|

|  Michael| 29|

Andy| 30|

+---------+---+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值