hive 合并同一列数据,并用某个字符分隔开

本文介绍了如何在ApacheHive3.1.3环境中使用SQL查询,包括合并具有相同数值的name列,以及使用concat_ws函数连接列表并处理NULL值,同时展示了collect_list和collect_set函数在数据去重中的应用。

环境 apache-hive-3.1.3

1、原始数据

select num, name 
from test0422 
where num is not null;

在这里插入图片描述

2、把相同num值的name合并

select num, concat_ws('|||', collect_list(name) )
from test0422
where num is not null
group by num;

在这里插入图片描述

3、 concat_ws 函数

  • concat_ws 代表 concat with separator(分隔符),是 concat 的特殊形式。
  • 语法格式:concat_ws(separator, str1, str2, …) 。
  • 如有任何一个参数为 NULL ,则返回值为 NULL,可以考虑使用 nvl 函数将 NULL 替换为 ‘’ 。
select concat_ws(',', nvl(column1, ''), column2, column3);

4、collect_list 函数

  • collect_list 函数用于将多个值收集到一个列表中,不去重。
  • 语法格式:collect_list(expr) 。
  • expr 可以是任意数据类型。但是外层有 concat_ws 时必须 cast(expr as string)。

5、collect_set 函数

  • collect_set 函数用于将多个值收集到一个列表中,去重。
  • 语法格式:collect_set(expr) 。
  • expr 可以是任意数据类型。但是外层有 concat_ws 时必须 cast(expr as string)。
select num, concat_ws('-', collect_set(name) )
from test04222
where num is not null
group by num;

在这里插入图片描述

在不同的 SQL 数据库中,将同一数据合并并用逗号隔开有不同的实现方法: ### MySQL 使用 `group_concat()` 函数,该函数的作用是将 `group by` 产生的同一中的值连接起来,返回一个字符串结果。基本语法为:`group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘隔符’] )`,可以使用 `distinct` 排除重复值,使用 `order by` 子句对结果中的值进行排序。示例代码如下: ```sql SELECT group_column, group_concat(column_to_concat separator ',') AS concatenated_values FROM your_table GROUP BY group_column; ``` 这里的 `group_column` 是用于,`column_to_concat` 是需要合并,`your_table` 是表名 [^1]。 ### SQL Server 使用 `STUFF` 函数结合 `FOR XML PATH` 来实现。`STUFF` 函数用于删除指定长度的字符并在指定位置插入另一字符。示例代码如下: ```sql SELECT DISTINCT group_column, STUFF((SELECT ',' + column_to_concat FROM your_table t2 WHERE t2.group_column = t1.group_column FOR XML PATH('')), 1, 1, '') AS concatenated_values FROM your_table t1; ``` `FOR XML PATH('')` 将查询结果以 XML 格式输出,`STUFF` 函数用于去除字符串开头多余的逗号 [^1]。 ### Hive 使用 `concat_ws` 和 `collect_list` 函数。`concat_ws` 函数以指定隔符将多个字符合并起来,`collect_list` 函数将内的字段值收集到一个表中。示例代码如下: ```sql SELECT num, concat_ws(',', collect_list(name) ) FROM test0422 WHERE num is not null GROUP BY num; ``` 这里假设表名为 `test0422`,`num` 是字段,`name` 是要合并的字段 [^2][^4]。 ### Oracle 使用 `LISTAGG` 函数,它可以将后的值连接成一个字符串。示例代码如下: ```sql SELECT group_column, LISTAGG(column_to_concat, ',') WITHIN GROUP (ORDER BY column_to_concat) AS concatenated_values FROM your_table GROUP BY group_column; ``` `WITHIN GROUP (ORDER BY column_to_concat)` 用于指定排序顺序。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值