MaxCompute SQL的数组字段的合并

在处理字段分组聚合时,如果需要多层次的聚合,有时还需要在新的层次进行该字段的合并,但SQL语言并没有提供直接的语法和简单的函数进行支持,经过MAP_UNION的去重操作,结合其他的一些数组转字典的操作,可以实现该功能。具体来说,已知表1中有两行数据

c1c2c3
s1d1r1,r2
s1d2r1,r3

怎么得到表2

c1c2c3
s1d1,d2r1,r2,r3

得到表2的数据,最直接的思路是通过GROUP BY进行分组聚合,c2列可以用过COLLECT_SET函数外加ARRAY_JOIN实现。对于c3列,需要先SPLIT成数组,然后再分组合并。查询MaxCompute SQL的函数手册,在数组方面并没有这样的功能。随后看到MAP_UNION的键可以去重,转而想到把数组转换成字典,合并字典的键后,再提取键转为数组,具体的代码可以参考:

WITH test_table AS (
    SELECT 's1' AS c1
           ,'d1' AS c2
           ,'r1,r2' AS c3
    UNION
    SELECT 's1' AS c1
           ,'d2' AS c2
           ,'r1,r3' AS c3
)
SELECT c1
       ,ARRAY_JOIN(COLLECT_SET(c2), ',')
       ,ARRAY_JOIN(MAP_KEYS(MAP_UNION(MAP_FROM_ARRAYS(SPLIT(c3, ','), ARRAY_REPEAT(1, SIZE(SPLIT(c3, ',')))))), ',')
FROM test_table
GROUP BY c1
;

另外一种思路是设法让表1回到表3的状态,然后再对c3通过COLLECT_SET函数外加ARRAY_JOIN来实现。

c1c2c3
s1d1r1
s1d1r2
s1d2r1
s1d2r3

发布人

jeremy1990

现居北京,就职于亚马逊中国,软件工程师。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注