如何用collect_set等函数实现map结构的数据
目录
- 1.数据准备
- 2.集合表示
- 3.字符串表示
- 4.map形式表示
1.数据准备
with temp_1 as (
select 'zhangsan' as name , 'bj' as area,'math' as course , 88 as score
union all
select 'lisi' as name , 'bj' as area,'math' as course , 99 as score
union all
select 'wangwu' as name , 'sh' as area,'chinese' as course , 92 as score
union all
select 'zhaoliu' as name , 'sh' as area,'chinese' as course , 78 as score
union all
select 'tainqi' as name , 'bj' as area,'chinese' as course , 60 as score
)
select
name
,area
,course
,score
from temp_1
结果如下:
name area course score
tainqi bj chinese 60
wangwu sh chinese 92
zhaoliu sh chinese 78
lisi bj math 99
zhangsan bj math 88
2.集合表示
select
course
,collect_set(score)
,collect_set(name)
from temp_1
group by
course
结果如下:
chinese [92,60,78] ["zhaoliu","wangwu","tainqi"]
math [88,99] ["zhangsan","lisi"]
3.字符串表示
select
course
,concat_ws(',',collect_set(score))
,concat_ws(',',collect_set(name))
from temp_1
group by
course
结果如下:
math 99,88 lisi,zhangsan
chinese 92,60,78 wangwu,zhaoliu,tainqi
4.map形式表示
select
course
,concat('{"',concat_ws('","',collect_set(concat(name,'":"',score))),'"}') indica_tr
,str_to_map(concat_ws(',',collect_set(concat(name,'=',score ))),',','=') indica_map
from temp_1
group by
course
结果如下:
math {"lisi":"99","zhangsan":"88"} {"lisi":"99","zhangsan":"88"}
chinese {"tainqi":"60","zhaoliu":"78","wangwu":"92"} {"tainqi":"60","wangwu":"92","zhaoliu":"78"}