hive中的wm_concat 同列非数字字符串的拼接

本文介绍在Hive中如何使用collect_set函数结合concat_ws来替代Oracle中的wm_concat函数,实现将同一组内的字符串用逗号连接起来。通过具体例子展示了如何将sys_region表中的相同ID下的name字段值进行合并。

oracle:

http://blog.youkuaiyun.com/lxpbs8851/article/details/7179291

 

之前写了个oracle 不支持 wm_concat 的解决办法。

 

现在在hive中遇到同样的问题,该如何解决?

sys_region(id,name)

1    a   

1    b   

2    c   

2    d   

想要得到结果

1  a,b

2  c,d

 

实现办法:

利用函数 collect_set

select id,concat_ws(',',collect_set(name))

from sys_region

group by id;

 

 

 

### Hive中 `GROUP_CONCAT` 函数的用法与实现 在Hive中,`GROUP_CONCAT` 是一个聚合函数,用于将分组中的值连接成一个字符串。其功能类似于MySQL中的 `GROUP_CONCAT` 函数。它能够根据指定的分隔符将同一组内的多个值合并为单个字符串输出[^3]。 #### 语法 ```sql GROUP_CONCAT(expression [SEPARATOR separator]) ``` - `expression`: 要进行拼接的字段或表达式。 - `SEPARATOR separator`: 可选参数,用于指定分隔符,默认情况下使用逗号`,`作为分隔符[^4]。 #### 特性 1. 如果分组内存在 `NULL` 值,则这些 `NULL` 值会被忽略。 2. 可以通过设置变量 `group_concat_max_len` 来限制结果字符串的最大长度。例如: ```sql SET SESSION group_concat_max_len = 1024; ``` 这里的 `1024` 表示最大长度为1024字符[^4]。 #### 示例 假设有一个名为 `info` 的表,结构如下: | locus | id | journal | |------------|------|---------| | AB086827 | 1 | JournalA| | AB086827 | 2 | JournalB| | AF040764 | 3 | JournalC| | AF040764 | 4 | JournalD| 执行以下查询语句: ```sql SELECT locus, GROUP_CONCAT(id SEPARATOR ',') AS concatenated_ids FROM info WHERE locus IN ('AB086827', 'AF040764') GROUP BY locus; ``` 返回结果为: | locus | concatenated_ids | |------------|------------------| | AB086827 | 1,2 | | AF040764 | 3,4 | 解释:`GROUP_CONCAT(id SEPARATOR ',')` 将每个 `locus` 分组中的 `id` 字段值用逗号`,`连接起来[^3]。 #### 注意事项 1. 如果未指定 `SEPARATOR` 参数,则默认使用逗号`,`作为分隔符[^3]。 2. 如果需要自定义分隔符,可以通过 `SEPARATOR` 参数指定其他字符或字符串[^4]。 ### 示例代码 以下是一个完整的示例,展示如何使用 `GROUP_CONCAT` 函数: ```sql -- 创建示例表 CREATE TABLE IF NOT EXISTS info ( locus STRING, id INT, journal STRING ); -- 插入数据 INSERT INTO info VALUES ('AB086827', 1, 'JournalA'), ('AB08627', 2, 'JournalB'), ('AF040764', 3, 'JournalC'), ('AF040764', 4, 'JournalD'); -- 使用 GROUP_CONCAT 函数 SELECT locus, GROUP_CONCAT(id SEPARATOR '-') AS concatenated_ids FROM info WHERE locus IN ('AB086827', 'AF040764') GROUP BY locus; ``` 执行结果: | locus | concatenated_ids | |------------|------------------| | AB086827 | 1-2 | | AF040764 | 3-4 | #### 结果说明 - 对于 `locus` 为 `'AB086827'` 的记录,`id` 值 `1` 和 `2` 被 `-` 连接。 - 对于 `locus` 为 `'AF040764'` 的记录,`id` 值 `3` 和 `4` 被 `-` 连接[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值