跳到主要内容
跳到主要内容

tuple-map-functions

map

从键值对创建 Map(key, value) 类型的值。

语法

map(key1, value1[, key2, value2, ...])

参数

  • key_n — Map 条目的键。任何支持作为 Map 的键类型的类型。
  • value_n — Map 条目的值。任何支持作为 Map 的值类型的类型。

返回值

示例

查询

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

从键数组或 map 以及值数组或 map 创建一个 map。

此函数是语法 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 — 用于创建 map 的键数组或 map ArrayMap。如果 keys 是一个数组,我们接受 Array(Nullable(T))Array(LowCardinality(Nullable(T))) 作为其类型,只要它不包含 NULL 值。
  • values - 用于创建 map 的值数组或 map ArrayMap

返回值

  • 一个 map,其键和值是从键数组和值数组/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 - 要从中提取键值对的字符串。 StringFixedString
  • key_value_delimiter - 分隔键和值的单个字符。默认为 :StringFixedString
  • pair_delimiters - 分隔对的字符集。默认为 , ,;StringFixedString
  • quoting_character - 用作引号字符的单个字符。默认为 "StringFixedString

返回值

示例

查询

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 序列化的 map 字符串键值对

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 或两个 arraystuples,其中第一个数组中的项表示键,第二个数组包含每个键的值。所有键数组应具有相同的类型,并且所有值数组应包含提升为一种类型的项 (Int64, UInt64Float64)。公共提升类型用作结果数组的类型。

返回值

  • 根据参数返回一个 maptuple,其中第一个数组包含排序后的键,第二个数组包含值。

示例

使用 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 或两个 arraystuples,其中第一个数组中的项表示键,第二个数组包含每个键的值。所有键数组应具有相同的类型,并且所有值数组应包含提升为一种类型的项 (Int64, UInt64Float64)。公共提升类型用作结果数组的类型。

返回值

  • 根据参数返回一个 maptuple,其中第一个数组包含排序后的键,第二个数组包含值。

示例

使用 Map 类型的查询

SELECT mapSubtract(map(1,1), map(1,1));

结果

┌─mapSubtract(map(1, 1), map(1, 1))─┐
│ {1:0} │
└───────────────────────────────────┘

使用元组 map 的查询

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

使用整数键填充 map 中缺失的键值对。为了支持将键扩展到最大值之外,可以指定最大键。更具体地说,该函数返回一个 map,其中键形成从最小键到最大键(或指定的 max 参数,如果指定)的序列,步长为 1,以及相应的值。如果未为键指定值,则默认值用作值。如果键重复,则只有第一个值(按出现顺序)与键关联。

语法

mapPopulateSeries(map[, max])
mapPopulateSeries(keys, values[, max])

对于数组参数,keysvalues 中的元素数量对于每一行必须相同。

参数

参数是 Maps 或两个 Arrays,其中第一个和第二个数组包含每个键的键和值。

映射数组

  • map — 具有整数键的 Map。 Map

返回值

  • 根据参数,返回一个 Map 或两个 ArraysTuple:排序后的键,以及与键对应的值。

示例

使用 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

返回给定键是否包含在给定的 map 中。

语法

mapContains(map, key)

参数

  • map — Map。 Map
  • key — 键。类型必须与 map 的键类型匹配。

返回值

  • 如果 map 包含 key,则返回 1,否则返回 0UInt8

示例

查询

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 可以优化此函数。启用此设置后,该函数仅读取 keys 子列,而不是整个 map。查询 SELECT mapKeys(m) FROM table 将转换为 SELECT m.keys FROM table

语法

mapKeys(map)

参数

  • 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 可以优化此函数。启用此设置后,该函数仅读取 values 子列,而不是整个 map。查询 SELECT mapValues(m) FROM table 将转换为 SELECT m.values FROM table

语法

mapValues(map)

参数

  • 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。 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

给定一个具有字符串键和 LIKE 模式的 map,此函数返回一个 map,其中包含键与模式匹配的元素。

语法

mapExtractKeyLike(map, pattern)

参数

  • map — 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)

参数

返回值

  • 返回通过对每个元素应用 func(map1[i], ..., mapN[i]) 从原始 map 获得的 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,其中仅包含 mapfunc(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)

如果 func(key, value) 对于 map 中的所有键值对都返回非 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)

参数

  • func – 可选函数,应用于 map 的键和值。 Lambda 函数
  • limit – 范围 [1..limit] 中的元素已排序。 (U)Int
  • map – 要排序的 Map。 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)

参数

  • func – 可选函数,应用于 map 的键和值。 Lambda 函数
  • limit – 范围 [1..limit] 中的元素已排序。 (U)Int
  • map – 要排序的 Map。 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} │
└──────────────────────────────────────────────────────────────────────────────────┘