SQL老司機,在SQL中計算 array & map & json數據
場景
通常,我們處理數據,一列數據類型要麽是字符串,要麽是數字,這些都是primitive類型的數據。在某些比較復雜的業務場景下,我們會在一列中使用復雜的格式,例如數組array, 對象(map),json等格式來表示復雜的數據,例如:
array_column
是數組類型。假如,我們希望統計array_column中所有數值的匯總值,那麽我們得遍歷每一行的數組中的每一個元素。
unnest語法
unnest( array) as table_alias(column_name)
表示把array類型展開成多行,行的名稱為column_name。unnest(map) as table(key_name, value_name)
表示把map類型展開成多行,key的名稱為key_name, value的名稱為value_name
註意,由於unnest接收的是array或者map類型的數據,如果用戶的輸入是個字符串類型,那麽要先轉化成json類型,然後再轉化成array類型或map類型,轉化的方式是
cast(json_parse(array_column) as array(bigint))
遍歷數組每一個元素
使用SQL把array展開成多行:
* | select array_column, a from log, unnest( cast( json_parse(array_column) as array(bigint) ) ) as t(a)
上述SQL把數組展開成多行數字,unnest( cast( json_parse(array_column) as array(bigint) ) ) as t(a)
,unnest語法把數組展開,以t來命名新生成的表,使用a來引用展開後的列。結果如下圖:
統計數組中的每個元素的和
* | select sum(a) from log, unnest( cast( json_parse(array_column) as array(bigint) ) ) as t(a)
按照數組中的每個元素進行group by計算
* | select a, count(1) from log, unnest( cast( json_parse(array_column) as array(bigint) ) ) as t(a) group by a
遍歷Map
遍歷Map中的元素
* | select map_column , a,b from log, unnest( cast( json_parse(map_column) as map(varchar, bigint) ) ) as t(a,b)
按照Map的key進行group by 統計
* | select key, sum(value) from log, unnest( cast( json_parse(map_column) as map(varchar, bigint) ) ) as t(key,value) GROUP BY key
格式化顯示histogram,numeric_histogram的結果
1.histogram
histogram函數類似於count group by 語法。語法參考文檔。
通常我們看到histogram的結果如下:
* | select histogram(method)
是一串json,無法配置視圖展示,我們可以用unnest語法,把json展開成多行配置視圖,例如:
* | select key , value from( select histogram(method) as his from log) , unnest(his ) as t(key,value)
接下來,可以配置可視化視圖:
2. numeric_histogram
numeric_histogram語法是為了把數值列分配到多個桶中去,相當於對數值列進行group by,具體語法參考文檔
* | select numeric_histogram(10,Latency)
numeric_histogram的輸出如下:
為了格式化展示該結果,我們這樣寫SQL:
* | select key,value from(select numeric_histogram(10,Latency) as his from log) , unnest(his) as t(key,value)
結果如下:
同時配置柱狀圖的形式展示:
原文鏈接
SQL老司機,在SQL中計算 array & map & json數據