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

摘要: 場景 一般,咱們處理數據,一列數據類型要麼是字符串,要麼是數字,這些都是primitive類型的數據。json

場景數組

一般,咱們處理數據,一列數據類型要麼是字符串,要麼是數字,這些都是primitive類型的數據。在某些比較複雜的業務場景下,咱們會在一列中使用複雜的格式,例如數組array, 對象(map),json等格式來表示複雜的數據,例如:函數

array_column 是數組類型。假如,咱們但願統計array_column中全部數值的彙總值,那麼咱們得遍歷每一行的數組中的每個元素。3d

unnest語法code

  • 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))

遍歷數組每個元素blog

使用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來引用展開後的列。結果以下圖:get

  • 統計數組中的每一個元素的和

* | 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)

結果以下:

同時配置柱狀圖的形式展現:

原文連接

相關文章
相關標籤/搜索