合并表中多个字段
本来想写点hive和hbase的东西,工作压力有点大,还没时间整理。先水一个sql,直接上表结构:
A表:
【name】 【age】 【 school】 【tel】
【li】 【18】 【BD】 【123】
【bob 】 【18 】 【JD 】 【123】
【paul 】 【18】 【ZD】 【123】
【ko】 【18】 【BD】 【123】
将就看吧,不会弄表格,需求是这样的,根据school分组,name,age,tel组成这样的形势 name,age,tel;name,age,tel;…
就是变成这面的格式:
【school 】 【merge_info】
【BD】 【li,18,123;ko,18,123】
【D】 【bob,18,123】
【ZD】 【paul,18,123】
这个sql就是需要掌握sql函数concat_ws() 和子查询,这里面三个字段的数据是经过两次合并,一次是将这个三个字段连接起来用逗号分隔,这个通过concat_ws()可以实现:
select school,concat_ws(‘,’,name,age,tel) as info
from A
用concat()函数手动加逗号也可以
上面的数据会变成这样:
【school 】 【 info】
【BD 】 【 li,18,123】
【BD 】 【 ko,18,123】
【JD 】 【bob,18,123】
【ZD 】 【paul,18,123】
一个select就可以看成是一个临时表么,在这张临时表上去实现上面的要求就清晰多了,要用到group by,但是group by连接不能直接用concat_ws()函数,将group by产生的同一个分组中的值连接起来,返回一个字符串可以用group_concat()函数
完整sql:
select school, group_concat(info separator ‘;’) as merge_info
from(
select school,concat_ws(‘,’,name,age,tel) as info
from A
)
group_concat不指定分隔符的话,默认是逗号分隔,mysql是支持,oracle我也不清楚是否支持,我这次是hivesql,还是用的concat_ws()实现的,hivesql是这样concat_ws(“;”,collect_set(info))实现。
又水了一篇,还是不会在这里建表格,路过的大佬指点一下,这上面写博客,怎么弄和excel上面的表格一样