本文介紹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']查詢和分析結果返回
_col0列,值為datalab-148****6461-cn-chengdu,即 etl_context 中提取的 project 欄位值。
cardinality函數
cardinality函數用於計算Map的大小。
文法
cardinality(x)參數說明
參數 | 說明 |
x | 參數值為map類型。 |
傳回值類型
bigint類型。
樣本
使用histogram函數擷取各個要求方法對應的請求數量,再通過cardinality函數擷取要求方法的種類數。
查詢和分析語句
* | SELECT histogram(request_method) AS request_method, cardinality(histogram(request_method)) AS "kinds"查詢和分析結果:
request_method列值為{"DELETE":5,"POST":7,"GET":41,"PUT":4},kinds列值為4,表示共有4種要求方法(DELETE、POST、GET、PUT)及各自的請求次數。
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"查詢和分析結果。查詢結果返回一行資料:request_method 列的值為
{"HEAD":686,"DELETE":13619,"POST":34365,"GET":138097,"PUT":34056},count 列的值為13619,即 DELETE 請求的數量。
histogram函數
histogram函數用於對查詢和分析結果進行分組,返回結果為JSON格式。類似於* | SELECT count(*) GROUP BY x。
文法
histogram(x)參數說明
參數 | 說明 |
x | 參數值為任意資料類型。 |
傳回值類型
map類型。
樣本
使用histogram函數擷取各個要求方法對應的請求數量。
查詢和分析語句
* | SELECT histogram(request_method) AS request_method查詢和分析結果為各HTTP要求方法的計數統計:
{"HEAD":30,"DELETE":564,"POST":1382,"GET":5420,"PUT":1334},其中GET請求數量最多(5420次)。
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)))查詢和分析結果為
{"class01":49,"class03":45,"class02":50,"class05":50,"class04":47}。
樣本2:返回一個空Map。
查詢和分析語句
*| SELECT map()查詢和分析結果返回結果為
{},即空的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)查詢和分析結果為
{"HEAD":47.0,"DELETE":26.0,"POST":80.0,"GET":51.0,"PUT":49.0}。
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)) )查詢和分析結果
null {"consumer_group":"etl-83d5****071d1911974d1965","shard_id":"1","dropped":"0","project":"atalab-14****66461-cn-chengdu","delivered":"2","failed":"0","logstore":"internal-etl-log","consumer":"etl-b****510a8ee7a9532c8d6-291294","accept":"2"}
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)查詢和分析結果為
{"10":"a","30":"c"}。
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)))查詢和分析結果為
["consumer","consumer_group","logstore","project","shard_id"]。
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)))查詢和分析結果為一個數組,包含 etl_context 各欄位的 value 值,例如
["datalab-148****6461-cn-chengdu", "internal-etl-log", "etl-83****4d1965", "etl-b2d40ed****c8d6-291294", "0"]。
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)查詢和分析結果為一個 map,其中鍵為 HTTP 要求方法(DELETE、POST、GET),值為各方法對應的
request_time浮點數數組,例如 DELETE 對應 [28.0, 80.0, 21.0, 54.0, ...],POST 對應 [77.0, 27.0, 52.0, 25.0, ...] 等。