場景
通常,我們處理資料,一列資料類型要麼是字元串,要麼是數字,這些都是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來引用展開後的列。結果如下圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuQmZ3MDNjJWY2QWZhJGN3QjYyYTOmRDNjdjNidDZyQ2NvwVbvNmLj5Wat4Wd5lGbh5iY1BXLn1WauU3bop3ZuFGat42YucWbp1iMhRXYvw1LcpDc0RHaiojIsJye.png)
- 統計數組中的每個元素的和
* | 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)
結果如下:
同時配置柱狀圖的形式展示: