本文介紹Map映射函數和運算子的基本文法及樣本。
Log Service支援如下Map映射函數和運算子。
函數名稱 | 文法 | 說明 | 支援SQL | 支援SPL |
[x] | 擷取Map中目標鍵的值。 | √ | × | |
cardinality(x) | 計算Map的大小。 | √ | × | |
element_at(x, key) | 擷取Map中目標鍵的值。 | √ | × | |
histogram(x) | 對查詢和分析結果進行分組,返回結果為JSON格式。 | √ | × | |
histogram_u(x) | 對查詢和分析結果進行分組,返回結果為多行多列格式。 | √ | × | |
map() | 返回一個空Map。 | √ | × | |
map(x, y) | 將兩個數組映射為一個Map。 | √ | × | |
map_agg(x, y) | 將x和y映射為一個Map。x為Map中的鍵,y為Map中的索引值。當y存在多個值時,隨機提取一個值作為索引值。 | √ | × | |
map_concat(x, y...) | 將多個Map合并為一個Map。 | √ | × | |
map_filter(x, lambda_expression) | 結合Lambda運算式,用於過濾Map中的元素。 | √ | × | |
map_keys(x) | 提取Map中所有的鍵,並以數組形式返回。 | √ | × | |
map_values(x) | 提取Map中所有鍵的值,並以數組形式返回。 | √ | × | |
multimap_agg(x, y) | 將x和y映射為一個Map。x為Map中的鍵,y為Map中的索引值,索引值為數組格式。當y存在多個值時,提取所有的值作為索引值。 | √ | × |
下標運算子
下標運算子用於擷取Map中的目標鍵的值。
文法
[x]
參數說明
參數 | 說明 |
x | 參數值為varchar類型。 |
傳回值類型
任意資料類型。
樣本
Log Service資料加工日誌中etl_context欄位值為map類型,您可以使用下標運算子擷取etl_context欄位值中project的值。
欄位範例
etl_context: { project:"datalab-148****6461-cn-chengdu" logstore:"internal-etl-log" consumer_group:"etl-83****4d1965" consumer:"etl-b2d40ed****c8d6-291294" shard_id:"0" }
查詢和分析語句
* | SELECT try_cast(json_parse(etl_context) AS map(varchar, varchar))['project']
查詢和分析結果
cardinality函數
cardinality函數用於計算Map的大小。
文法
cardinality(x)
參數說明
參數 | 說明 |
x | 參數值為map類型。 |
傳回值類型
bigint類型。
樣本
使用histogram函數擷取各個要求方法對應的請求數量,再通過cardinality函數擷取要求方法的種類數。
查詢和分析語句
* | SELECT histogram(request_method) AS request_method, cardinality(histogram(request_method)) AS "kinds"
查詢和分析結果
element_at函數
element_at函數用於擷取Map中目標鍵的值。
文法
element_at(x, key)
參數說明
參數 | 說明 |
x | 參數值為map類型。 |
key | Map中的一個鍵。 |
傳回值類型
任意資料類型。
樣本
使用histogram函數擷取各個要求方法對應的請求數量,然後通過element_at函數擷取DELETE欄位的值。
查詢和分析語句
* | SELECT histogram(request_method) AS request_method, element_at(histogram(request_method),'DELETE') AS "count"
查詢和分析結果
histogram函數
histogram函數用於對查詢和分析結果進行分組,返回結果為JSON格式。類似於* | SELECT count(*) GROUP BY x
。
文法
histogram(x)
參數說明
參數 | 說明 |
x | 參數值為任意資料類型。 |
傳回值類型
map類型。
樣本
使用histogram函數擷取各個要求方法對應的請求數量。
查詢和分析語句
* | SELECT histogram(request_method) AS request_method
查詢和分析結果
histogram_u函數
histogram_u函數用於對查詢和分析結果進行分組,返回結果為多行多列。
文法
histogram_u(x)
參數說明
參數 | 說明 |
x | 參數值為任意資料類型。 |
傳回值類型
bigint類型。
樣本
使用histogram_u函數擷取各個要求方法對應的請求數量,並以直條圖展示查詢和分析結果。
查詢和分析語句
*|SELECT histogram_u(request_method) as request_method
查詢和分析結果
map函數
map函數用於返回一個空Map或者將兩個數組映射為一個Map。
文法
返回一個空Map。
map()
將兩個數組映射為一個Map。
map(x,y)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
y | 參數值為array類型。 |
傳回值類型
map類型。
樣本
樣本1:class欄位表示班級,number欄位表示班級人數,欄位值為array類型。現使用map函數將兩個欄位的值(兩個數組)映射為一個Map,將班級和班級人數一一對應。
欄位範例
class:["class01","class02","class03","class04","class05"] number:[49,50,45,47,50]
查詢和分析語句
* | SELECT map(try_cast(json_parse(class) AS array(varchar)) ,try_cast(json_parse(number) AS array(bigint)))
查詢和分析結果
樣本2:返回一個空Map。
查詢和分析語句
*| SELECT map()
查詢和分析結果
map_agg函數
map_agg函數用於將x和y映射為一個Map。x為Map中的鍵,y為Map中的索引值。當y存在多個值時,隨機提取一個值作為索引值。
文法
map_agg(x, y)
參數說明
參數 | 說明 |
x | 參數值為任意資料類型。 |
y | 參數值為任意資料類型。 |
傳回值類型
map類型。
樣本
提取request_method欄位值和request_time欄位值,然後映射為一個Map。request_method欄位值為Map中的鍵,request_time欄位值為Map中的索引值。
欄位範例
request_method:POST request_time:80
查詢和分析語句
* | SELECT map_agg(request_method,request_time)
查詢和分析結果
map_concat函數
map_concat函數用於將多個Map合并為一個Map。
文法
map_concat(x, y)
參數說明
參數 | 說明 |
x | 參數值為map類型。 |
y | 參數值為map類型。 |
傳回值類型
map類型。
樣本
Log Service資料加工日誌中etl_context欄位值和progress欄位值都為map類型,您可以使用map_concat函數將這兩個欄位值合并為一個Map。
欄位樣本
etl_context: { project:"datalab-148****6461-cn-chengdu" logstore:"internal-etl-log" consumer_group:"etl-83****4d1965" consumer:"etl-b2d40ed****c8d6-291294" shard_id:"0" } progress: { accept:3 dropped:0 delivered:3 failed:0 }
查詢和分析語句
* | SELECT map_concat( cast ( json_parse(etl_context) AS map(varchar, varchar) ), cast (json_parse(progress) AS map(varchar, varchar)) )
查詢和分析結果
map_filter函數
map_filter函數和Lambda運算式結合,用於過濾Map中的元素。
文法
map_filter(x, lambda_expression)
參數說明
參數 | 說明 |
x | 參數值為map類型。 |
lambda_expression_expression | Lambda運算式。更多資訊,請參見Lambda運算式。 |
傳回值類型
map類型。
樣本
將兩個數組映射為一個新的Map,且Map中的索引值不為null。其中(k, v) -> v is not null
為Lambda運算式。
查詢和分析語句
* | SELECT map_filter(map(array[10, 20, 30], array['a', NULL, 'c']), (k, v) -> v is not null)
查詢和分析結果
map_keys函數
map_keys函數用於提取Map中所有的鍵,並以數組形式返回。
文法
map_keys(x)
參數說明
參數 | 說明 |
x | 參數值為map類型。 |
傳回值類型
array類型。
樣本
Log Service資料加工日誌中etl_context欄位值為map類型,您可以使用map_keys函數提取etl_context欄位值中所有的鍵。
欄位範例
etl_context: { project:"datalab-148****6461-cn-chengdu" logstore:"internal-etl-log" consumer_group:"etl-83****4d1965" consumer:"etl-b2d40ed****c8d6-291294" shard_id:"0" }
查詢和分析語句
* | SELECT map_keys(try_cast(json_parse(etl_context) AS map(varchar, varchar)))
查詢和分析結果
map_values函數
map_values函數用於提取Map中所有鍵的值,並以數組形式返回。
文法
map_values(x)
參數說明
參數 | 說明 |
x | 參數值為map類型。 |
傳回值類型
array類型。
樣本
Log Service資料加工日誌中etl_context欄位值為map類型,您可以使用map_values函數提取etl_context欄位值中所有鍵的值。
欄位範例
etl_context: { project:"datalab-148****6461-cn-chengdu" logstore:"internal-etl-log" consumer_group:"etl-83****4d1965" consumer:"etl-b2d40ed****c8d6-291294" shard_id:"0" }
查詢和分析語句
* | SELECT map_values(try_cast(json_parse(etl_context) AS map(varchar, varchar)))
查詢和分析結果
multimap_agg函數
multimap_agg函數用於將x和y映射為一個Map。x為Map中的鍵,y為Map中的索引值,索引值為數組格式。當y存在多個值時,提取所有的值作為索引值。
文法
multimap_agg(x, y)
參數說明
參數 | 說明 |
x | 參數值為任意資料類型。 |
y | 參數值為任意資料類型。 |
傳回值類型
map類型。
樣本
提取request_method欄位和request_time欄位的所有值,然後映射為一個Map。request_method欄位值為Map中的鍵,request_time欄位值為Map中的索引值,索引值為數組格式。
欄位範例
request_method:POST request_time:80
查詢和分析語句
* | SELECT multimap_agg(request_method,request_time)
查詢和分析結果