1.需求描述
在数据处理过程中,我们不光要将一行变为多行,有时候还需要将多行变为一行。
有如下格式的数据:
msgid appid
1490549504092 1002496
1490549504092 1002505
1490549504105 1005565
1490549504105 1002496
我们可能需要将相同的msgid对应的不同的appid汇聚到一起。怎么完成这个任务呢?
2.collect_set
collect_set可以完美解决上面的需求。直接看代码
SELECT b.msgid,
b.allappid
FROM
(SELECT a.msgid,
concat_ws('-',collect_set( cast(a.appid as string))) as allappid
FROM
(SELECT msginfo.msgid AS msgid,
appinfo.appid AS appid
FROM XXX tablesample(0.1 percent)
WHERE date = 20170327
GROUP BY msginfo.msgid,appinfo.appid)a
GROUP BY a.msgid)b
where size(split(b.allappid,"-")) > 1
limit 100
最终出来的结果:
1490549504092 1002496-1002505
1490549504105 1005565-1002496
3.值得注意的地方
1.collect_set顾名思义,就是根据group by后面的字段分组,然后将collect_set方法里的字段聚合在一块。
2.collect_set接受的参数是string类型,如果是其他类型的数据,需要转为string。
3.split方法返回的是一个数组,求数组长度的函数为size。