MaxCompute 2.0複雜數據類型之array

1. 含義

相似於Java中的array。有序、可重複。javascript

2. 場景

什麼樣的數據,適合使用array類型來存儲呢?這裏列舉了幾個我在開發中實際用到的場景。java

2.1 標籤類的數據

爲何說標籤類數據適合使用array類型呢?
(1)標籤通常是一個只有key、沒有value的結構;
(2)標籤的數量(枚舉值個數)會很是多;
(3)標籤的變化會比較頻繁;
(4)標籤會過時;
所以,比起「建立多個字段」、「使用指定分隔符分隔的字符串」、「使用map」等方法,使用array是更合適的。數組

2.2 對象列表

對象有多種固定的屬性,簡單的key-value格式沒法知足,可使用array嵌套struct的方式定義。減小了維護數據字典的工做量。app

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 a
xxx b
xxx c

3.1.2 posexplode

select posexplode(t.arr) from (select array('a','b','c') as arr) t; 
pos val
0 a
1 b
2 c
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 ; 
id serialno arr
xxx 0 a
xxx 1 b
xxx 2 c

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; 
arr
["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; 
arr
["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',','); 
_c0
["a","b","c"]

3.5 構造數組

select array('aa','bb','cc'); 
_c0
["aa","bb","cc"]

3.6 數組元素排序

select sort_array(array('b','c','e','a','d')); 
_c0
["a","b","c","d","e"]
select sort_array(array(1,10,100,2,3)); 
_c0
[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; 
arr
["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 數組是否相等

數組的相等或不等,沒法經過「=」來判斷,所以要嘗試一些其餘的方法。最經常使用的辦法,就是轉成字符串再比較。spa

4.2.1 考慮順序是否一致

直接轉成字符串後,比較是否相等code

4.2.2 不考慮順序是否一致

先排序,再轉成字符串,而後比較是否相等對象


原文連接
本文爲雲棲社區原創內容,未經容許不得轉載。blog

相關文章
相關標籤/搜索