在日常取数或者数据处理中,我们会遇到需要把一列变多行的数据拆分操作,或者是需要把多行变一列的合并操作,接下来,就总结下在sql中通过lateral view explode()和concat_ws()/collect_set()的处理方法。
一列变多行lateral view explode()
假设有这样一个 表1(table_1):
id | tag |
---|---|
43fjkdlj | tag1|tag2|tag6 |
757jhidf | tag3|tag5 |
863hskdh | tag1|tag9|tag10|tag11 |
从表中可以看出一个id对应的tag标签有多个,想要把它拆分开,变成以下 表2(table_2):
id | tag |
---|---|
43fjkdlj | tag1 |
43fjkdlj | tag2 |
43fjkdlj | tag6 |
757jhidf | tag3 |
757jhidf | tag5 |
863hskdh | tag1 |
863hskdh | tag9 |
863hskdh | tag10 |
863hskdh | tag11 |
那么就可以使用lateral view explode()实现:
select id
,tag_1
from table_1 lateral view explode(split(tag,'\\|'))tag as tag_1
上述语句中explode()里可以说明分隔符是什么,对于”|”注意转义符,所以是“\\|”
多行变一列concat_ws()/collect_set()
但如果是上述表2要转换成表1的格式,就需要做合并操作,实现如下:
select id
,concat_ws('\\|',collect_set(tag)) as tag
from table_2
group by id
concat_ws()可以根据指定连接符,上述语句也可以使用“-”连接,看自己需要和方便极客,要强调的是合并操作使用collect_set(),最后,不要忘记group by哦!
好了,就到这里吧,有问题欢迎大家留言评论~