本文介绍Map映射函数和运算符的基本语法及示例。
日志服务支持如下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类型。 |
返回值类型
任意数据类型。
示例
日志服务数据加工日志中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类型。
示例
日志服务数据加工日志中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类型。
示例
日志服务数据加工日志中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类型。
示例
日志服务数据加工日志中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)
查询和分析结果