使用任意数量的 key/value 对构造 Map 列
语法
map(key1, value1 [, key2, value2, ...])
参数
返回值
示例
SELECT map(1, 2, 3, 4), map('k1', 'v1', 'k2', 'v2');
查询结果
{1:2,3:4} {'k1':'v1','k2':'v2'}
查询 Map 的某个 key 的数据,不包含此 key 的行将填充默认值,等价于 map[key]
语法
arrayElement(map, key)
参数
返回值
示例
WITH map('k1', 1) AS m SELECT arrayElement(m, 'k1'), m['k1'], m['k2'];
查询结果
1 1 0
注意
使用 arrayElement 时会先读取整个 map 列再进行筛选,因此对于隐式列 Map 查询性能较低。隐式列 Map 更推荐使用 ** mapElement
(或者 {}
) 方式查询key。
查询 Map 的某个 key 的数据,不包含此 key 的行将填充 NULL,等价于 map{key}
语法
mapElement(map, key)
参数
返回值
示例
WITH map('k1', 1) AS m SELECT mapElement(m, 'k1'), m{'k1'}, m{'k2'};
查询结果
1 1 NULL
注意
隐式列 Map 使用此方式只需要读取对应隐式列,效率相比 arrayElement 更高;
获取 Map 数据每行的 key 并返回为 Array
语法
mapKeys(map)
参数
返回值
示例
WITH map('k1', 'v1', 'k2', 'v2') AS m SELECT mapKeys(m);
查询结果
['k1','k2']
注意
对于隐式列 Map,此方法会先读取整个 map 列,然后提取其中的 key 返回。效率较低,建议使用下面的 getMapKeys
**** 方法。
获取 Map 数据每行的 value 并返回为 Array
语法
mapValues(map)
参数
返回值
示例
WITH map('k1', 'v1', 'k2', 'v2') AS m SELECT mapValues(m);
查询结果
['v1','v2']
获取 Map 列(在指定分区)中包含的 key 的列表,结果中每个 key 只会出现一次
语法
getMapKeys('database', 'table', 'map' [, 'partition_regex'])
参数
返回值
示例
INSERT INTO some_db.map_table (m) VALUES {'k1': 'v1', 'k2': 'v2'}; SELECT getMapKeys('some_db', 'map_table', 'm');
查询结果
['k1','k2']
注意
此函数通过读取每个 part 的元数据来查找 key,因此只适用于隐式列 Map。
返回 Map 列的每行是否包含目标 key
语法
mapContains(map, key)
参数
返回值
示例
WITH map('k1', 'v1', 'k2', 'v2') AS m SELECT mapContains(m, 'k1'), mapContains(m, 'k3');
查询结果
1 0
使用指定的分隔符将 String 解析为 Map(String, String) 类型。
语法
str_to_map(pattern, pair_delimiter, key_value_delimiter)
参数
返回值
示例
SELECT str_to_map('k1=v1, k2=v2', ',', '=');
查询结果
{'k1':'v1','k2':'v2'}
使用两个 Array 构造 Map 列,第一个 Array 为 key,第二个 Array 为 value。
语法
mapFromArrays(keys, values)
参数
返回值
示例
SELECT mapFromArrays(['a', 'b', 'c'], [1, 2, 3]);
查询结果
{'a':1,'b':2,'c':3}
将多个 Map 列对应 key 的 value 相加
语法
mapAdd(map1, map2 [, ...])
参数
返回值
示例
SELECT mapAdd(map(1,1), map(1,2), map(2,2));
查询结果
{1:3,2:2}
将多个 Map 列对应 key 的 value 相减(第一个值减去之后所有的值)
语法
mapAdd(map1, map2 [, ...])
参数
返回值
示例
SELECT mapSubtract(map(1, 2)::Map(Int16,Int16), map(1, 1)::Map(Int16,Int16), map(2, -2)::Map(Int16,Int16));
查询结果
{1:1,2:2}
要求 Map key 类型为 Integer,填充该 Map 从最小的 key 到最大的 key 之间的所有 key 值,填充的 value 为对应类型的默认值。最大 key 也可由第二个参数指定。
该函数也可以传入两个 Array,第一个作为 key,第二个作为 value。
语法
mapPopulateSeries(map[, max]) mapPopulateSeries(keys, values[, max])
参数
返回值
示例
SELECT mapPopulateSeries(map(2, 10, 5, 20)), mapPopulateSeries(map(2, 10, 5, 20), 3); SELECT mapPopulateSeries([1, 5], [5, 20], 6);
查询结果
{2:10,3:0,4:0,5:20} {2:10,3:0} ([1,2,3,4,5,6],[5,0,0,0,20,0])
返回 Map 列的每行是否包含符合指定 pattern 的 key
语法
mapContainsKeyLike(map, pattern)
参数
返回值
示例
WITH map('k1', 'v1', 'k2', 'v2') AS m SELECT mapContainsKeyLike(m, 'k%'), mapContainsKeyLike(m, 'm%');
查询结果
1 0
筛选 Map 列中符合指定 pattern 的 key 及其对应 value
语法
mapExtractKeyLike(map, pattern)
参数
返回值
示例
WITH map('k1', 'v1', 'k2', 'v2') AS m SELECT mapExtractKeyLike(m, 'k%'), mapExtractKeyLike(m, 'm%');
查询结果
{'k1':'v1','k2':'v2'} {}
对 Map 中每个 key-value 对执行指定的 lambda 表达式。
语法
mapApply(lambda, map)
参数
返回值
示例
WITH map(1, 1, 2, 2) AS m SELECT mapApply((k, v) -> (toString(k), v * 2), m);
查询结果
{'1':2,'2':4}
使用传入的条件过滤 Map 中的 key-value 对。
语法
mapFilter(lambda, map)
参数
返回值
示例
SELECT _map, mapFilter((k, v) -> ((v % 2) = 0), _map) FROM ( SELECT map('key1', number, 'key2', number * 2) AS _map FROM numbers(3) )
查询结果
{'key1':0,'key2':0} {'key1':0,'key2':0} {'key1':1,'key2':2} {'key2':2} {'key1':2,'key2':4} {'key1':2,'key2':4}
复制 map1,并使用 map2 中的 value 更新到复制的 Map 列中并返回。对于 map1 和 map2 都存在的 key,将会保留 map2 中对应的 value。
语法
mapUpdate(map1, map2)
参数
返回值
示例
WITH map('k1', 1, 'k2', 1) AS m1, map('k1', 2, 'k3', 2) AS m2 SELECT mapUpdate(m1, m2), mapUpdate(m2, m1);
查询结果
{'k1':2,'k2':1,'k3':2} {'k1':1,'k2':1,'k3':2}