Map 函数
extractKeyValuePairs
引入版本:v
从任意字符串中提取键值对。该字符串不需要完全符合键值对格式。
它可以包含噪声(例如日志文件)。需要通过函数参数指定要解析的键值对格式。
一个键值对由键、紧随其后的 key_value_delimiter 以及一个值组成。也支持带引号的键和值。键值对之间必须由键值对分隔符分隔。
语法
参数
data- 要从中提取键值对的字符串。String 或 FixedString。key_value_delimiter- 用作键与值之间分隔符的字符。默认值为:。String 或 FixedString。pair_delimiters- 用作各键值对之间分隔符的字符集合。默认值为\space、,和;。String 或 FixedString。quoting_character- 用作引用符号的字符。默认值为 `"。String 或 FixedString。unexpected_quoting_character_strategy- 在read_key和read_value阶段处理出现在非预期位置的引用符号的策略。可选值:invalid、accept和promote。invalid会丢弃键/值并切换回WAITING_KEY状态;accept会将其视为普通字符;promote会切换到READ_QUOTED_{KEY/VALUE}状态并从下一个字符开始。默认值为INVALID。
返回值
- 以 Map(String, String) 形式返回提取出的键值对。
示例
查询:
简单示例
将单引号用作引号字符
unexpected_quoting_character_strategy 示例:
unexpected_quoting_character_strategy=invalid
unexpected_quoting_character_strategy=accept
unexpected_quoting_character_strategy=promote
不支持转义序列时的转义序列
语法
别名: str_to_map, mapFromString
参数
- 无。
返回值
示例
extractKeyValuePairsWithEscaping
引入版本: v
与 extractKeyValuePairs 相同,但支持转义。
支持的转义序列:\x、\N、\a、\b、\e、\f、\n、\r、\t、\v 和 \0。
非标准转义序列将按原样返回(包括反斜杠),除非它们是以下字符之一:
\\、'、"、backtick、/、= 或 ASCII 控制字符(c <= 31)。
此函数适用于预转义和后转义都不适用的场景。例如,考虑以下输入字符串:a: "aaaa\"bbb"。预期输出为:a: aaaa\"bbbb。
- 预转义:预转义后将输出:
a: "aaaa"bbb",然后extractKeyValuePairs将输出:a: aaaa- 后转义:
extractKeyValuePairs将输出a: aaaa\,后转义将保持不变。
- 后转义:
键中的前导转义序列将被跳过,值中的前导转义序列将被视为无效。
启用转义序列支持的转义序列
语法
参数
- 无
返回值
示例
map
引入版本:v21.1
从键值对创建一个类型为 Map(key, value) 的值。
语法
参数
返回值
返回一个包含键值对的 Map。Map(Any, Any)
示例
用法示例
mapAdd
在 v20.7 中引入
收集所有键并对相应的值求和。
语法
参数
arg1[, arg2, ...]—Map类型或由两个数组组成的元组,其中第一个数组中的元素表示键,第二个数组包含每个键对应的值。Map(K, V)或Tuple(Array(T), Array(T))
返回值
返回一个 Map 或元组,其中第一个数组包含已排序的键,第二个数组包含对应的值。Map(K, V) 或 Tuple(Array(T), Array(T))
示例
使用 Map 类型
使用元组
mapAll
引入版本:v23.4
判断某个条件是否对 map 中的所有键值对都成立。
mapAll 是一个高阶函数。
你可以将一个 lambda 函数作为第一个参数传递给它。
语法
参数
func— Lambda 函数。Lambda functionmap— 要检查的映射(Map)。Map(K, V)
返回值
如果所有键值对都满足条件,则返回 1,否则返回 0。UInt8
示例
用法示例
mapApply
引入于:v22.3 版本
将一个函数应用于 map 中的每个元素。
语法
参数
func— Lambda 函数。Lambda functionmap— 要应用函数的 Map。Map(K, V)
返回值
返回一个新的 Map,通过对原始 Map 的每个元素应用 func 得到。Map(K, V)
示例
用法示例
mapConcat
首次引入版本:v23.4
根据键是否相等来连接多个 map。
如果多个输入 map 中存在相同键的元素,所有这些元素都会被添加到结果 map 中,但通过 [] 运算符只能访问到第一个元素。
语法
参数
maps— 任意数量的Map。Map
返回值
返回一个 Map,其中包含作为参数传入的所有 Map 的合并结果。Map
示例
用法示例
mapContainsKey
引入版本:v21.2
判断 map 中是否包含某个键。
语法
别名:mapContains
参数
返回值
如果 Map 中包含该键,则返回 1,否则返回 0。UInt8
示例
用法示例
mapContainsKeyLike
引入版本:v23.4
检查 map 中是否存在与指定模式通过 LIKE 匹配的键。
语法
参数
map— 要搜索的映射。Map(K, V)pattern— 用于匹配键的模式。const String
返回值
如果 map 中包含与 pattern 匹配的键,则返回 1,否则返回 0。UInt8
示例
用法示例
mapContainsValue
引入版本:v25.6
用于判断某个值是否存在于 map 中。
语法
参数
返回值
如果 map 中包含该值则返回 1,否则返回 0。UInt8
示例
用法示例
mapContainsValueLike
自 v25.5 引入
检查 map 中是否存在符合指定 LIKE 模式的值。
语法
参数
map— 要搜索的 Map。Map(K, V)pattern— 用于匹配map中值的模式。const String
返回值
如果 map 中包含与 pattern 匹配的值,则返回 1,否则返回 0。UInt8
示例
用法示例
mapExists
引入版本:v23.4
用于判断在一个 map 中是否存在至少一对键值对满足指定条件。
mapExists 是一个高阶函数。
你可以将一个 lambda 函数作为第一个参数传递给它。
语法
参数
func— 可选。Lambda 函数。Lambda functionmap— 要检查的 Map 类型值。Map(K, V)
返回值
如果至少有一个键值对满足条件,则返回 1,否则返回 0。UInt8
示例
用法示例
mapExtractKeyLike
引入版本:v23.4
给定一个键为字符串的 map 和一个 LIKE 模式,此函数返回一个仅包含键与该模式匹配元素的 map。
语法
参数
map— 要从中提取数据的 Map。Map(K, V)pattern— 用于匹配键的模式字符串。const String
返回值
返回一个 map,其中包含键与指定模式匹配的元素。如果没有元素匹配该模式,则返回一个空 map。Map(K, V)
示例
用法示例
mapExtractValueLike
引入版本:v25.5
给定一个值为字符串的 map 和一个 LIKE 模式,此函数返回一个 map,其中只包含值与该模式匹配的元素。
语法
参数
map— 要从中提取元素的 Map。Map(K, V)pattern— 用于匹配值的模式。const String
返回值
返回一个 Map,其中仅包含值与指定模式匹配的元素。如果没有元素匹配该模式,则返回空 Map。Map(K, V)
示例
用法示例
mapFilter
在 v22.3 中引入
通过对每个 map 元素应用函数来过滤该 map。
语法
参数
func— Lambda 函数。Lambda functionmap— 要筛选的 Map。Map(K, V)
返回值
返回一个 map,仅包含那些使 func 返回非 0 值的元素。Map(K, V)
示例
使用示例
mapFromArrays
引入版本:v23.3
从键的数组或 Map 与值的数组或 Map 创建一个 Map。
该函数是语法 CAST([...], 'Map(key_type, value_type)') 的一种更便捷的替代写法。
语法
别名:MAP_FROM_ARRAYS
参数
返回值
返回一个 Map,其键和值由键数组和值数组/Map 构造而成。Map
示例
基本用法
使用 map 作为输入
mapKeys
引入版本:v21.2
返回给定 map 的键。
通过启用设置 optimize_functions_to_subcolumns,可以对该函数进行优化。
启用该设置后,函数只会读取 keys 子列,而不是整个 map。
查询 SELECT mapKeys(m) FROM table 会被转换为 SELECT m.keys FROM table。
语法
参数
map— 要从中提取键的 Map。Map(K, V)
返回值
返回一个包含该 map 所有键的数组。Array(T)
示例
用法示例
mapPartialReverseSort
自 v23.4 引入
对 map 的元素按降序排序,并带有一个额外的 limit 参数,用于进行部分排序。 如果指定了 func 函数,则根据将 func 函数应用于 map 的键和值所得到的结果来确定排序顺序。
语法
参数
func— 可选。Lambda 函数。Lambda functionlimit— 对范围[1..limit]内的元素进行排序。(U)Int*map— 要排序的 Map。Map(K, V)
返回值
返回一个按降序部分排序后的 map。Map(K, V)
示例
用法示例
mapPartialSort
自 v23.4 版本引入
对 map 的元素按升序排序,并接受一个额外的 limit 参数,用于执行部分排序。 如果指定了函数 func,则排序顺序由函数 func 作用于 map 的键和值后得到的结果来决定。
语法
参数
func— 可选。Lambda 函数。Lambda functionlimit— 范围[1..limit]内的元素将被排序。(U)Int*map— 要排序的 Map。Map(K, V)
返回值
返回一个部分有序的 Map。Map(K, V)
示例
用法示例
mapPopulateSeries
引入版本:v20.10
在具有整数键的 map 中填充缺失的键值对。 为了支持将键扩展到当前最大值之外,可以指定一个最大键。 更具体地说,该函数返回一个 map,其键从最小键到最大键(或指定的 max 参数)构成步长为 1 的序列,并具有对应的值。 如果某个键未指定值,则使用默认值作为该键的值。 如果键出现重复,则只将第一个值(按出现顺序)与该键关联。
语法
参数
map— 具有整数键的 Map。Map((U)Int*, V)keys— 键数组。Array(T)values— 值数组。Array(T)max— 可选。键的最大值。Int8或Int16或Int32或Int64或Int128或Int256
返回值
返回一个 Map,或由两个数组组成的元组:第一个数组包含按排序后顺序排列的键,第二个数组包含对应键的值。Map(K, V) 或 Tuple(Array(UInt*), Array(Any))
示例
使用 Map 类型
使用映射数组
mapReverseSort
引入版本:v23.4
对 map 中的元素进行降序排序。 如果指定了函数 func,则排序顺序由函数 func 作用于 map 的键和值所产生的结果来决定。
语法
参数
func— 可选。Lambda 函数。Lambda functionmap— 要排序的 Map。Map(K, V)
返回值
返回按降序排序后的 Map。Map(K, V)
示例
用法示例
mapSort
引入于:v23.4
按升序对 map 的元素进行排序。 如果指定了函数 func,则排序顺序由将 func 函数应用于 map 的键和值后得到的结果决定。
语法
参数
func— 可选。Lambda 函数。Lambda functionmap— 要排序的 Map。Map(K, V)
返回值
返回按升序排序的 Map。Map(K, V)
示例
用法示例
mapSubtract
自 v20.7 版本引入。
收集所有键并对相应的值进行相减运算。
语法
参数
arg1[, arg2, ...]— 类型为Map或由两个数组组成的Tuple,其中第一个数组的元素表示键,第二个数组包含每个键对应的值。Map(K, V)或Tuple(Array(T), Array(T))
返回值
返回一个 Map 或 Tuple,其中第一个数组包含排序后的键,第二个数组包含对应的值。Map(K, V) 或 Tuple(Array(T), Array(T))
示例
使用 Map 类型
使用 tuple map 时
mapUpdate
引入版本:v22.3
对于两个 map,返回在第一个 map 的基础上,用第二个 map 中对应键的值更新后的结果。
语法
参数
返回值
返回按 map2 中对应键的值更新后的 map1。Map(K, V)
示例
基本用法
mapValues
首次引入于:v21.2
返回给定 map 中所有的值。
通过启用 optimize_functions_to_subcolumns 这个设置,可以对该函数进行优化。
启用该设置后,函数只会读取 values 子列,而不是整个 map。
查询 SELECT mapValues(m) FROM table 会被重写为 SELECT m.values FROM table。
语法
参数
map— 要从中提取值的 Map。Map(K, V)
返回值
返回一个数组,包含该 Map 中的所有值。Array(T)
示例
使用示例