赞
踩
concat():函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL
- 执行代码:
- select concat('a','b',null);
-
- 执行结果:
- NULL
concat_ws():函数在连接字符串的时候,只要有一个字符串不是NULL,就不会返回NULL。concat_ws():函数需要指定分隔符。
- 执行代码1:
- hive>
- select concat_ws('-','a','b');
- 执行结果:
- a-b
-
- 执行代码2:
- hive>
- select concat_ws('-','a','b',null);
- 执行结果:
- a-b
-
- 执行代码3:
- hive>
- select concat_ws('','a','b',null);
- 执行结果:
- ab
参考链接:SQL小知识点系列-3-collect_list/collect_set(列转行) - 知乎
他们都是将分组中的某列转为一个数组返回,
不同的是collect_list不去重而collect_set去重
根据某个字段分组后,利用collect_list()函数把分在一组的数据合并在一起,默认分隔符’,’ 如
a | b | c |
---|---|---|
1 | 1 | “1”,“2” |
1 | 2 | “1”,"2” |
1 | 2 | “1”,“2”,“2” |
原始temp数据
id | class |
---|---|
loongshaw | 1 |
loongshaw | 2 |
loongshaw | 3 |
loongshaw | 4 |
期望值
id | class |
---|---|
loongshaw | 1,2,3,4 |
输入代码:
- select
- t.id,
- concat_ws(',', collect_set(t.class))
- from
- temp t
- group by
- t.id
实际结果,class合并后并不是有序
id | class |
---|---|
loongshaw | 1,3,2,4 |
解决方式:
将collect_set无序集合,改成collect_list或sort_array进行排序。
concat_ws(',', sort_array(collect_set(t.class), false))
sort_array(e: column, asc: boolean)将array中元素排序(自然排序),默认asc。
或者:
concat_ws(',',collect_list(t.class))
结果,class合并后有序
id | class |
---|---|
loongshaw | 1,2,3,4 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。