天天看點

SQL老司機,在SQL中計算 array & map & json資料

場景

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

__source__:  11.164.232.105
__tag__:__hostname__:  vm-req-170103232316569850-tianchi111932.tc
__topic__:  TestTopic_4
array_column:  [1,2,3]
double_column:  1.23
map_column:  {"a":1,"b":2}
text_column:  商品           

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

SQL老司機,在SQL中計算 array & map & json資料
  • 統計數組中的每個元素的和
* | select   sum(a)    from log, unnest( cast( json_parse(array_column)   as array(bigint) ) ) as  t(a)           
SQL老司機,在SQL中計算 array & map & json資料
  • 按照數組中的每個元素進行group by計算
* | select   a, count(1)    from log, unnest( cast( json_parse(array_column)   as array(bigint) ) ) as  t(a)     group by a           
SQL老司機,在SQL中計算 array & map & json資料

周遊Map

  • 周遊Map中的元素
* | select  map_column , a,b    from log, unnest( cast( json_parse(map_column)   as map(varchar, bigint) ) ) as  t(a,b)           
SQL老司機,在SQL中計算 array & map & json資料
  • 按照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           
SQL老司機,在SQL中計算 array & map & json資料

格式化顯示histogram,numeric_histogram的結果

1.histogram

histogram函數類似于count group by 文法。文法參考

文檔

通常我們看到histogram的結果如下:

* | select histogram(method)           
SQL老司機,在SQL中計算 array & map & json資料

是一串json,無法配置視圖展示,我們可以用unnest文法,把json展開成多行配置視圖,例如:

* | select  key , value  from( select histogram(method) as his from log) , unnest(his ) as t(key,value)           
SQL老司機,在SQL中計算 array & map & json資料

接下來,可以配置可視化視圖:

SQL老司機,在SQL中計算 array & map & json資料

2. numeric_histogram

numeric_histogram文法是為了把數值列配置設定到多個桶中去,相當于對數值列進行group by,具體文法參考

* | select numeric_histogram(10,Latency)           

numeric_histogram的輸出如下:

SQL老司機,在SQL中計算 array & map & json資料

為了格式化展示該結果,我們這樣寫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資料

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

SQL老司機,在SQL中計算 array & map & json資料
SQL老司機,在SQL中計算 array & map & json資料
SQL老司機,在SQL中計算 array & map & json資料