1. 含義
類似于Java中的array。有序、可重複。
2. 場景
什麼樣的資料,适合使用array類型來存儲呢?這裡列舉了幾個我在開發中實際用到的場景。
2.1 标簽類的資料
為什麼說标簽類資料适合使用array類型呢?
(1)标簽一般是一個隻有key、沒有value的結構;
(2)标簽的數量(枚舉值個數)會非常多;
(3)标簽的變化會比較頻繁;
(4)标簽會過期;
是以,比起“建立多個字段”、“使用指定分隔符分隔的字元串”、“使用map”等方法,使用array是更合适的。
2.2 對象清單
對象有多種固定的屬性,簡單的key-value格式無法滿足,可以使用array嵌套struct的方式定義。減少了維護資料字典的工作量。
3. 玩轉array
3.1 數組字段拆成多行
3.1.1 explode
select explode(t.arr) from (select array('a','b','c') as arr) t;
col |
---|
a |
b |
c |
select t1.id,t2.arr from (select 'xxx' as id,array('a','b','c') as arr) t1 lateral view explode(t1.arr) t2 as arr ;
id | arr |
---|---|
xxx | |
3.1.2 posexplode
select posexplode(t.arr) from (select array('a','b','c') as arr) t;
pos | val |
---|---|
1 | |
2 |
select t1.id,t2.serialno,t2.arr from (select 'xxx' as id,array('a','b','c') as arr) t1 lateral view posexplode(t1.arr) t2 as serialno,arr ;
serialno | ||
---|---|---|
3.2 多行合并成數組
3.2.1 不去重
select collect_list(t.c1) as arr from ( select 'a' as c1 union all select 'a' as c1 union all select 'b' as c1) t;
["a","a","b"] |
3.2.2 去重
select collect_set(t.c1) as arr from ( select 'a' as c1 union all select 'a' as c1 union all select 'b' as c1) t;
["a","b"] |
3.3 數組拼成字元串
select concat_ws(',',t.arr) from (select array('a','b','c') as arr) t;
_c0 |
---|
a,b,c |
3.4 字元串轉成數組
select split('a,b,c',',');
["a","b","c"] |
3.5 構造數組
select array('aa','bb','cc');
["aa","bb","cc"] |
3.6 數組元素排序
select sort_array(array('b','c','e','a','d'));
["a","b","c","d","e"] |
select sort_array(array(1,10,100,2,3));
[1,2,3,10,100] |
3.7 數組中增加一項
select split(concat('d,',concat_ws(',',t.arr)),',') as arr from (select array('a','b','c') as arr) t;
["d","a","b","c"] |
4. 常見用法
4.1 代替無法使用的with cube
例如現在有張下單記錄流水表,記錄着每一條下單記錄,包含字段“訂單ID”、“下單人ID”、“下單管道(網站/app)”。
現在要統計“各管道的下單人數和訂單數”,管道次元包含“不限”、“網站”、“APP”三項。
一般做這些包含“不限”的次元的聚合計算時,都使用group by xxx with cube關鍵字。但是maxcompute中暫時還不支援這個關鍵字,是以我們換另一種方法來實作。
SELECT tt.`下單管道`, COUNT(1) AS `下單人數`, SUM(tt.`下單量`) AS `下單量`
FROM (
SELECT t1.`下單人ID`, t2.`下單管道`, SUM(t1.`下單量`) AS `下單量`
FROM (
SELECT t.`下單人ID`, t.`下單管道`, SUM(t.`下單量`) AS `下單量`
FROM (
SELECT `訂單ID`, `下單人ID`, `下單管道`, 1 AS `下單量`
FROM `下單記錄流水表`
) t
GROUP BY t.`下單人ID`,
t.`下單管道`
) t1
LATERAL VIEW EXPLODE(array(t1.`下單管道`, '不限')) t2 AS `下單管道`
GROUP BY t1.`下單人ID`,
t2.`下單管道`
) tt
GROUP BY tt.`下單管道`
4.2 數組是否相等
數組的相等或不等,無法通過“=”來判斷,是以要嘗試一些其他的方法。最常用的辦法,就是轉成字元串再比較。
4.2.1 考慮順序是否一緻
直接轉成字元串後,比較是否相等
4.2.2 不考慮順序是否一緻
先排序,再轉成字元串,然後比較是否相等