tuple-map-functions
map
从键值对创建类型为 Map(key, value) 的值。
语法
map(key1, value1[, key2, value2, ...])
参数
返回值
- 包含
key:value
对的映射。 Map(key, value)。
示例
查询
SELECT map('key1', number, 'key2', number * 2) FROM numbers(3);
结果
┌─map('key1', number, 'key2', multiply(number, 2))─┐
│ {'key1':0,'key2':0} │
│ {'key1':1,'key2':2} │
│ {'key1':2,'key2':4} │
└──────────────────────────────────────────────────┘
mapFromArrays
从键数组和值数组或映射创建映射。
此函数是语法 CAST([...], 'Map(key_type, value_type)')
的便捷替代方案。例如,而不是编写
CAST((['aa', 'bb'], [4, 5]), 'Map(String, UInt32)')
,或CAST([('aa',4), ('bb',5)], 'Map(String, UInt32)')
您可以编写 mapFromArrays(['aa', 'bb'], [4, 5])
。
语法
mapFromArrays(keys, values)
别名:MAP_FROM_ARRAYS(keys, values)
参数
keys
— 用于创建映射的键的数组或映射 Array 或 Map。如果keys
是数组,我们接受Array(Nullable(T))
或Array(LowCardinality(Nullable(T)))
作为其类型,只要它不包含 NULL 值。values
- 用于创建映射的值的数组或映射 Array 或 Map。
返回值
- 一个映射,其键和值由键数组和值数组/映射构造。
示例
查询
select mapFromArrays(['a', 'b', 'c'], [1, 2, 3])
结果
┌─mapFromArrays(['a', 'b', 'c'], [1, 2, 3])─┐
│ {'a':1,'b':2,'c':3} │
└───────────────────────────────────────────┘
mapFromArrays
也接受类型为 Map 的参数。这些在执行期间被转换为元组数组。
SELECT mapFromArrays([1, 2, 3], map('a', 1, 'b', 2, 'c', 3))
结果
┌─mapFromArrays([1, 2, 3], map('a', 1, 'b', 2, 'c', 3))─┐
│ {1:('a',1),2:('b',2),3:('c',3)} │
└───────────────────────────────────────────────────────┘
SELECT mapFromArrays(map('a', 1, 'b', 2, 'c', 3), [1, 2, 3])
结果
┌─mapFromArrays(map('a', 1, 'b', 2, 'c', 3), [1, 2, 3])─┐
│ {('a',1):1,('b',2):2,('c',3):3} │
└───────────────────────────────────────────────────────┘
extractKeyValuePairs
将键值对字符串转换为 Map(String, String)。解析对噪声(例如日志文件)具有容错性。输入字符串中的键值对由键、键值分隔符和值组成。键值对由对分隔符分隔。键和值可以加引号。
语法
extractKeyValuePairs(data[, key_value_delimiter[, pair_delimiter[, quoting_character]]])
别名
str_to_map
mapFromString
参数
data
- 要从中提取键值对的字符串。 String 或 FixedString。key_value_delimiter
- 分隔键和值的单个字符。默认为:
。 String 或 FixedString。pair_delimiters
- 分隔对的字符集。默认为,
和;
。 String 或 FixedString。quoting_character
- 用作引号字符的单个字符。默认为"
。 String 或 FixedString。
返回值
- 键值对的映射。类型: Map(String, String)
示例
查询
SELECT extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil') as kv
结果
┌─kv──────────────────────────────────────────────────────────────────────┐
│ {'name':'neymar','age':'31','team':'psg','nationality':'brazil'} │
└─────────────────────────────────────────────────────────────────────────┘
使用单引号 '
作为引号字符
SELECT extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'') as kv
结果
┌─kv───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ {'name':'neymar','age':'31','team':'psg','nationality':'brazil','last_key':'last_value'} │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
没有转义序列支持的转义序列
SELECT extractKeyValuePairs('age:a\\x0A\\n\\0') AS kv
结果
┌─kv─────────────────────┐
│ {'age':'a\\x0A\\n\\0'} │
└────────────────────────┘
恢复使用 toString
序列化的映射字符串键值对
SELECT
map('John', '33', 'Paula', '31') AS m,
toString(m) as map_serialized,
extractKeyValuePairs(map_serialized, ':', ',', '\'') AS map_restored
FORMAT Vertical;
结果
Row 1:
──────
m: {'John':'33','Paula':'31'}
map_serialized: {'John':'33','Paula':'31'}
map_restored: {'John':'33','Paula':'31'}
extractKeyValuePairsWithEscaping
与 extractKeyValuePairs
相同,但支持转义。
支持的转义序列:\x
、\N
、\a
、\b
、\e
、\f
、\n
、\r
、\t
、\v
和 \0
。非标准转义序列按原样返回(包括反斜杠),除非它们是以下之一:\\
、'
、"
、反引号
、/
、=
或 ASCII 控制字符 (c <= 31)。
此函数将满足预转义和后转义不合适的使用案例。例如,考虑以下输入字符串:a: "aaaa\"bbb"
。预期输出为:a: aaaa\"bbbb
。
- 预转义:预转义它将输出:
a: "aaaa"bbb"
,然后extractKeyValuePairs
将输出:a: aaaa
- 后转义:
extractKeyValuePairs
将输出a: aaaa\
,后转义将保持原样。
键中的前导转义序列将被跳过,对于值将被视为无效。
示例
启用转义序列支持的转义序列
SELECT extractKeyValuePairsWithEscaping('age:a\\x0A\\n\\0') AS kv
结果
┌─kv────────────────┐
│ {'age':'a\n\n\0'} │
└───────────────────┘
mapAdd
收集所有键并对相应的值得以求和。
语法
mapAdd(arg1, arg2 [, ...])
参数
参数是 maps 或两个 arrays 的 tuples,其中第一个数组表示键,第二个数组包含每个键的值。所有键数组都应该具有相同的类型,并且所有值数组都应该包含可以提升到一个类型的项(Int64、UInt64 或 Float64)。通用提升类型用作结果数组的类型。
返回值
示例
使用 Map
类型的查询
SELECT mapAdd(map(1,1), map(1,1));
结果
┌─mapAdd(map(1, 1), map(1, 1))─┐
│ {1:2} │
└──────────────────────────────┘
使用元组的查询
SELECT mapAdd(([toUInt8(1), 2], [1, 1]), ([toUInt8(1), 2], [1, 1])) as res, toTypeName(res) as type;
结果
┌─res───────────┬─type───────────────────────────────┐
│ ([1,2],[2,2]) │ Tuple(Array(UInt8), Array(UInt64)) │
└───────────────┴────────────────────────────────────┘
mapSubtract
收集所有键并对相应的值得以求差。
语法
mapSubtract(Tuple(Array, Array), Tuple(Array, Array) [, ...])
参数
参数是 maps 或两个 arrays 的 tuples,其中第一个数组表示键,第二个数组包含每个键的值。所有键数组都应该具有相同的类型,并且所有值数组都应该包含可以提升到一个类型的项(Int64、UInt64 或 Float64)。通用提升类型用作结果数组的类型。
返回值
示例
使用 Map
类型的查询
SELECT mapSubtract(map(1,1), map(1,1));
结果
┌─mapSubtract(map(1, 1), map(1, 1))─┐
│ {1:0} │
└───────────────────────────────────┘
使用元组映射的查询
SELECT mapSubtract(([toUInt8(1), 2], [toInt32(1), 1]), ([toUInt8(1), 2], [toInt32(2), 1])) as res, toTypeName(res) as type;
结果
┌─res────────────┬─type──────────────────────────────┐
│ ([1,2],[-1,0]) │ Tuple(Array(UInt8), Array(Int64)) │
└────────────────┴───────────────────────────────────┘
mapPopulateSeries
使用整数键填充映射中缺少的键值对。为了支持将键扩展到最大值之外,可以指定最大键。更具体地说,该函数返回一个映射,其中键以 1 为步长从最小键到最大键(如果指定了 max
参数)形成一个序列,以及对应的值。如果未为键指定值,则使用默认值作为值。如果键重复,则仅将第一个值(按出现顺序)与键关联。
语法
mapPopulateSeries(map[, max])
mapPopulateSeries(keys, values[, max])
对于数组参数,每行的 keys
和 values
中的元素数量必须相同。
参数
参数是 Maps 或两个 Arrays,其中第一个和第二个数组包含每个键的键和值。
映射数组
map
— 具有整数键的映射。 Map。
或
keys
— 键数组。 Array(Int).values
— 值数组。 Array(Int).max
— 最大键值。可选。 Int8, Int16, Int32, Int64, Int128, Int256。
返回值
示例
使用 Map
类型的查询
SELECT mapPopulateSeries(map(1, 10, 5, 20), 6);
结果
┌─mapPopulateSeries(map(1, 10, 5, 20), 6)─┐
│ {1:10,2:0,3:0,4:0,5:20,6:0} │
└─────────────────────────────────────────┘
使用映射数组的查询
SELECT mapPopulateSeries([1,2,4], [11,22,44], 5) AS res, toTypeName(res) AS type;
结果
┌─res──────────────────────────┬─type──────────────────────────────┐
│ ([1,2,3,4,5],[11,22,0,44,0]) │ Tuple(Array(UInt8), Array(UInt8)) │
└──────────────────────────────┴───────────────────────────────────┘
mapContains
返回给定键是否包含在给定映射中。
语法
mapContains(map, key)
参数
map
— 映射。 Map。key
— 键。类型必须与map
的键类型匹配。
返回值
- 如果
map
包含key
,则为1
,否则为0
。 UInt8。
示例
查询
CREATE TABLE tab (a Map(String, String)) ENGINE = Memory;
INSERT INTO tab VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});
SELECT mapContains(a, 'name') FROM tab;
结果
┌─mapContains(a, 'name')─┐
│ 1 │
│ 0 │
└────────────────────────┘
mapKeys
返回给定 map 的键。
通过启用设置 optimize_functions_to_subcolumns 可以优化此函数。启用该设置后,函数仅读取 键 子列,而不是整个 map。查询 SELECT mapKeys(m) FROM table
将转换为 SELECT m.keys FROM table
。
语法
mapKeys(map)
参数
map
— 映射。 Map。
返回值
- 包含
map
中所有键的数组。 Array。
示例
查询
CREATE TABLE tab (a Map(String, String)) ENGINE = Memory;
INSERT INTO tab VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});
SELECT mapKeys(a) FROM tab;
结果
┌─mapKeys(a)────────────┐
│ ['name','age'] │
│ ['number','position'] │
└───────────────────────┘
mapValues
返回给定 map 的值。
通过启用设置 optimize_functions_to_subcolumns 可以优化此函数。启用该设置后,函数仅读取 值 子列,而不是整个 map。查询 SELECT mapValues(m) FROM table
将转换为 SELECT m.values FROM table
。
语法
mapValues(map)
参数
map
— 映射。 Map。
返回值
- 包含
map
中所有值的数组。 Array。
示例
查询
CREATE TABLE tab (a Map(String, String)) ENGINE = Memory;
INSERT INTO tab VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});
SELECT mapValues(a) FROM tab;
结果
┌─mapValues(a)─────┐
│ ['eleven','11'] │
│ ['twelve','6.0'] │
└──────────────────┘
mapContainsKeyLike
语法
mapContainsKeyLike(map, pattern)
参数
map
— 映射。 Map。pattern
- 要匹配的字符串模式。
返回值
- 如果
map
包含类似于指定模式的key
,则为1
,否则为0
。
示例
查询
CREATE TABLE tab (a Map(String, String)) ENGINE = Memory;
INSERT INTO tab VALUES ({'abc':'abc','def':'def'}), ({'hij':'hij','klm':'klm'});
SELECT mapContainsKeyLike(a, 'a%') FROM tab;
结果
┌─mapContainsKeyLike(a, 'a%')─┐
│ 1 │
│ 0 │
└─────────────────────────────┘
mapExtractKeyLike
给定一个具有字符串键的 map 和一个 LIKE 模式,此函数返回一个包含键匹配该模式的元素的 map。
语法
mapExtractKeyLike(map, pattern)
参数
map
— 映射。 Map。pattern
- 要匹配的字符串模式。
返回值
- 包含键匹配指定模式的元素的 map。如果没有任何元素匹配该模式,则返回一个空 map。
示例
查询
CREATE TABLE tab (a Map(String, String)) ENGINE = Memory;
INSERT INTO tab VALUES ({'abc':'abc','def':'def'}), ({'hij':'hij','klm':'klm'});
SELECT mapExtractKeyLike(a, 'a%') FROM tab;
结果
┌─mapExtractKeyLike(a, 'a%')─┐
│ {'abc':'abc'} │
│ {} │
└────────────────────────────┘
mapApply
将函数应用于 map 的每个元素。
语法
mapApply(func, map)
参数
返回值
- 返回一个 map,该 map 通过对每个元素应用
func(map1[i], ..., mapN[i])
从原始 map 获得。
示例
查询
SELECT mapApply((k, v) -> (k, v * 10), _map) AS r
FROM
(
SELECT map('key1', number, 'key2', number * 2) AS _map
FROM numbers(3)
)
结果
┌─r─────────────────────┐
│ {'key1':0,'key2':0} │
│ {'key1':10,'key2':20} │
│ {'key1':20,'key2':40} │
└───────────────────────┘
mapFilter
通过将函数应用于每个 map 元素来过滤 map。
语法
mapFilter(func, map)
参数
返回值
- 返回一个 map,该 map 仅包含
map
中func(map1[i], ..., mapN[i])
返回非 0 值的元素。
示例
查询
SELECT mapFilter((k, v) -> ((v % 2) = 0), _map) AS r
FROM
(
SELECT map('key1', number, 'key2', number * 2) AS _map
FROM numbers(3)
)
结果
┌─r───────────────────┐
│ {'key1':0,'key2':0} │
│ {'key2':2} │
│ {'key1':2,'key2':4} │
└─────────────────────┘
mapUpdate
语法
mapUpdate(map1, map2)
参数
返回值
- 返回一个 map1,其中更新了 map2 中对应键的值。
示例
查询
SELECT mapUpdate(map('key1', 0, 'key3', 0), map('key1', 10, 'key2', 10)) AS map;
结果
┌─map────────────────────────────┐
│ {'key3':0,'key1':10,'key2':10} │
└────────────────────────────────┘
mapConcat
基于键的相等性连接多个 map。如果相同键的元素存在于多个输入 map 中,则所有元素都将添加到结果 map 中,但只有第一个元素可以通过操作符 []
访问。
语法
mapConcat(maps)
参数
maps
– 任意多个 Maps。
返回值
- 返回一个 map,其中包含作为参数传递的连接 map。
示例
查询
SELECT mapConcat(map('key1', 1, 'key3', 3), map('key2', 2)) AS map;
结果
┌─map──────────────────────────┐
│ {'key1':1,'key3':3,'key2':2} │
└──────────────────────────────┘
查询
SELECT mapConcat(map('key1', 1, 'key2', 2), map('key1', 3)) AS map, map['key1'];
结果
┌─map──────────────────────────┬─elem─┐
│ {'key1':1,'key2':2,'key1':3} │ 1 │
└──────────────────────────────┴──────┘
mapExists([func,], map)
如果 map
中至少存在一对键值对,其中 func(key, value)
返回非 0 值,则返回 1。否则,返回 0。
mapExists
是一个 高阶函数。您可以将 lambda 函数作为第一个参数传递给它。
示例
查询
SELECT mapExists((k, v) -> (v = 1), map('k1', 1, 'k2', 2)) AS res
结果
┌─res─┐
│ 1 │
└─────┘
mapAll([func,]map)
如果 map
中所有键值对的 func(key, value)
返回非 0 值,则返回 1。否则,返回 0。
请注意,mapAll
是一个 高阶函数。您可以将 lambda 函数作为第一个参数传递给它。
示例
查询
SELECT mapAll((k, v) -> (v = 1), map('k1', 1, 'k2', 2)) AS res
结果
┌─res─┐
│ 0 │
└─────┘
mapSort([func,], map)
按升序对 map 的元素进行排序。如果指定了 func
函数,则排序顺序由应用于 map 的键和值的 func
函数的结果确定。
示例
SELECT mapSort(map('key2', 2, 'key3', 1, 'key1', 3)) AS map;
┌─map──────────────────────────┐
│ {'key1':3,'key2':2,'key3':1} │
└──────────────────────────────┘
SELECT mapSort((k, v) -> v, map('key2', 2, 'key3', 1, 'key1', 3)) AS map;
┌─map──────────────────────────┐
│ {'key3':1,'key2':2,'key1':3} │
└──────────────────────────────┘
有关更多详细信息,请参阅 arraySort
函数 的参考。
mapPartialSort
按升序对 map 的元素进行排序,并添加 limit
参数以允许部分排序。如果指定了 func
函数,则排序顺序由应用于 map 的键和值的 func
函数的结果确定。
语法
mapPartialSort([func,] limit, map)
参数
返回值
- 部分排序的 map。 Map。
示例
SELECT mapPartialSort((k, v) -> v, 2, map('k1', 3, 'k2', 1, 'k3', 2));
┌─mapPartialSort(lambda(tuple(k, v), v), 2, map('k1', 3, 'k2', 1, 'k3', 2))─┐
│ {'k2':1,'k3':2,'k1':3} │
└───────────────────────────────────────────────────────────────────────────┘
mapReverseSort([func,], map)
按降序对 map 的元素进行排序。如果指定了 func
函数,则排序顺序由应用于 map 的键和值的 func
函数的结果确定。
示例
SELECT mapReverseSort(map('key2', 2, 'key3', 1, 'key1', 3)) AS map;
┌─map──────────────────────────┐
│ {'key3':1,'key2':2,'key1':3} │
└──────────────────────────────┘
SELECT mapReverseSort((k, v) -> v, map('key2', 2, 'key3', 1, 'key1', 3)) AS map;
┌─map──────────────────────────┐
│ {'key1':3,'key2':2,'key3':1} │
└──────────────────────────────┘
有关更多详细信息,请参阅函数 arrayReverseSort。
mapPartialReverseSort
按降序对 map 的元素进行排序,并添加 limit
参数以允许部分排序。如果指定了 func
函数,则排序顺序由应用于 map 的键和值的 func
函数的结果确定。
语法
mapPartialReverseSort([func,] limit, map)
参数
返回值
- 部分排序的 map。 Map。
示例
SELECT mapPartialReverseSort((k, v) -> v, 2, map('k1', 3, 'k2', 1, 'k3', 2));
┌─mapPartialReverseSort(lambda(tuple(k, v), v), 2, map('k1', 3, 'k2', 1, 'k3', 2))─┐
│ {'k1':3,'k3':2,'k2':1} │
└──────────────────────────────────────────────────────────────────────────────────┘