1. 程式人生 > >SQL老司機,在SQL中計算 array & map & json數據

SQL老司機,在SQL中計算 array & map & json數據

生成 lag ble VC map histogram 無法 命名 一個

摘要: 場景 通常,我們處理數據,一列數據類型要麽是字符串,要麽是數字,這些都是primitive類型的數據。

場景

通常,我們處理數據,一列數據類型要麽是字符串,要麽是數字,這些都是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數據