在複雜的業務情境下,日誌欄位的值可能為數組(array)、對象(map)等類型。對這種特殊類型的日誌欄位進行查詢和分析時,您可以先使用UNNEST子句將欄位值展開。
文法
-
將array類型的資料展開為多行單列形式,列名為column_name。
UNNEST(x) AS table_alias(column_name) -
將map類型的資料展開為多行多列形式,列名為key_name和value_name。
UNNEST(y) AS table(key_name,value_name)
UNNEST子句處理的是array或者map類型的資料。如果您輸入的資料為字串類型,則需要先轉化為JSON類型,然後再轉化為array類型或map類型,轉化方法為try_cast(json_parse(array_column) as array(bigint))。更多資訊,請參見類型轉換函式。
參數說明
|
參數 |
說明 |
|
x |
資料類型為array類型。 |
|
column_name |
將array類型的資料展開後,指定一個列名。該列用於存放array中的元素。 |
|
y |
資料類型為map類型。 |
|
key_name |
將map類型的資料展開後,指定一個列名。該列用於存放map中的鍵。 |
|
value_name |
將map類型的資料展開後,指定一個列名。該列用於存放map中的索引值。 |
樣本
樣本1
將number欄位的值(array類型)展開為多行單列形式。
-
欄位範例
number:[49, 50, 45, 47, 50] -
查詢和分析語句
* | SELECT a FROM log, UNNEST(cast(json_parse(number) AS array(bigint))) AS t(a) -
查詢和分析結果返回 a 列,值分別為 49、50、45、47、50,即
number欄位中各元素的展開值。
樣本2
將number欄位的值(array類型)展開為多行單列形式,並進行求和計算。
-
欄位範例
此處僅提供一條日誌範例,求和計算是針對所有日誌,即對所有日誌中的number欄位的值進行求和。
number:[49, 50, 45, 47, 50] -
查詢和分析語句
* | SELECT sum(a) AS sum FROM log, UNNEST(cast(json_parse(number) as array(bigint))) AS t(a) -
查詢和分析結果返回 sum 列,值為 368248,即所有日誌中
number欄位各元素的求和結果。
樣本3
將number欄位的值(array類型)展開為多行單列形式,並對各個值進行分組統計。
-
欄位範例
number:[49, 50, 45, 47, 50] -
查詢和分析語句
* | SELECT a, count(*) AS count FROM log, UNNEST(cast(json_parse(number) as array(bigint))) AS t(a) GROUP BY a -
查詢和分析結果:
a為 50 時count為 1194,a為 47 時count為 597,a為 49 時count為 597,a為 45 時count為 597。
樣本4
將number欄位的值(map類型)展開為多行多列形式。
-
欄位範例
result:{ anomaly_type:"OverThreshold" dim_name:"request_time" is_anomaly:true score:1 value:"3.000000"} -
查詢和分析語句
* | select key, value FROM log, UNNEST( try_cast(json_parse(result) as map(varchar, varchar)) ) AS t(key, value)
樣本5
將number欄位的值(map類型)展開為多行多列形式,並對各個鍵進行分組統計。
-
欄位範例
result:{ anomaly_type:"OverThreshold" dim_name:"request_time" is_anomaly:true score:1 value:"3.000000"} -
查詢和分析語句
* | select key, count(*) AS count FROM log, UNNEST( try_cast(json_parse(result) as map(varchar, varchar)) ) AS t(key, value) GROUP BY key -
查詢和分析結果顯示,UNNEST 展開後的 5 個欄位(
anomaly_type、dim_name、is_anomaly、score、value)對應的count值均為 5422,表明每條日誌的 result 欄位被正確展開為等量的索引值對記錄。
樣本6
使用histogram函數擷取各個要求方法對應的請求數量,返回結果為map類型。然後通過unnest子句將histogram函數的返回結果展開為多行多列形式,並通過柱狀圖展示。
-
查詢和分析語句
* | SELECT key, value FROM( SELECT histogram(request_method) AS result FROM log ), UNNEST(result) AS t(key, value) -
查詢和分析結果
