拼接:concat、concat_ws和形成集合collect_set、collect_list用法
学习三个函数:
concat 进行字符串拼接
collect_set() 将分组的数据变成一个set集合。里面的元素是不可重复的。
collect_list(): 里面是可以重复的。
concat_ws(分隔符,集合) : 将集合中的所有元素通过分隔符变为字符串。
实例:
需求:
-- 将下面的数据格式
zhangsan chinese 90
zhangsan math 87
zhangsan english 63
zhangsan nature 76
lisi chinese 60
lisi math 30
lisi english 78
lisi nature 0
wangwu chinese 89
wangwu math 25
wangwu english 81
wangwu nature 9
-- 转成:
zhangsan chinese:90,math:87,english:63,nature:76
lisi chinese:60,math:30,english:78,nature:0
wangwu chinese:89,math:25,english:81,nature:9
(行转列)
select name,concat(subject,":",cj) from map_temp;
结果:
name _c1
zhangsan chinese:90
zhangsan math:87
zhangsan english:63
zhangsan nature:76
lisi chinese:60
lisi math:30
lisi english:78
lisi nature:0
wangwu chinese:89
wangwu math:25以上这个结果再合并:
select name,collect_set(concat(subject,":",cj)) from map_temp
group by name;lisi ["nature:0","english:78","math:30","chinese:60"]
wangwu ["math:25","chinese:89"]
zhangsan ["nature:76","english:63","math:87","chinese:90"]
将集合中的元素通过逗号进行拼接:
select name,concat_ws(",",collect_set(concat(subject,":",cj))) from map_temp group by name;结果:
zhangsan chinese:90,math:87,english:63,nature:76
lisi chinese:60,math:30,english:78,nature:0
wangwu chinese:89,math:25,english:81,nature:9
想将数据变为:
lisi {"chinese":"60","math":"30","english":"78","nature":"0"}
wangwu {"chinese":"89","math":"25"}
zhangsan {"chinese":"90","math":"87","english":"63","nature":"76"}
需求:将字符串变为map集合 使用一个函数 str_to_map
select name,str_to_map(concat_ws(",",collect_set(concat(subject,":",cj)))) from map_temp group by name;