在複雜的業務情境下,日誌欄位的值可能為數組(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)
查詢和分析結果
樣本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)
查詢和分析結果
樣本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
查詢和分析結果
樣本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
查詢和分析結果
樣本6
使用histogram函數擷取各個要求方法對應的請求數量,返回結果為map類型。然後通過unnest子句將histogram函數的返回結果展開為多行多列形式,並通過柱狀圖展示。
查詢和分析語句
* | SELECT key, value FROM( SELECT histogram(request_method) AS result FROM log ), UNNEST(result) AS t(key, value)
查詢和分析結果