语法: arrayElement(map, key)
参数: map为map列名,key为待查询的key名
说明: 查询map的某个key的数据,不包含此key的行将填充默认值,等价于map[key]
示例:
select arrayElement(m, 'k1') from map_table; ┌─arrayElement(m, 'k1')─┐ │ v1 │ │ │ └───────────────────────┘
注意: 列名不需要加引号,key名在key类型为String时需要加引号
三种Map类型使用arrayElement时都会先查询整个map列数据,然后筛选出需要的key数据并对不存在此key的行填充默认值,因此查询性能较低。Byte Map和Byte Compact Map类型推荐使用mapElement(或者{})方式查询key。
语法: mapElement(map,key)
参数: map为map列名,key为待查询的key名
说明: 查询map的某个key的数据,不包含此key的行将填充null,等价于map{key}
示例:
select mapElement(m, 'k1') from map_table; -- 对于KV Map ┌─mapElement(m, 'k1')─┐ │ v1 │ │ ᴺᵁᴸᴸ │ └─────────────────────┘ -- 对于Byte Map和Byte Compact Map ┌─__m__'k1'─┐ │ v1 │ │ ᴺᵁᴸᴸ │ └───────────┘
注意: 列名不需要加引号,key名在key类型为String时需要加引号
Byte Map和Byte Compact Map类型会直接查询隐式列,效率高;KV Map会先查询整个Map列,再筛选key的数据。
语法: map(key1, value1[, key2, value2, ...])
参数: key1, key2为key, value1, value2 为value
说明: 构造map列
示例:
select map(1, 2, 3, 4) insert into map_table values (1, map('k1', 'v1', 'k2', 'v2'))
语法: mapKeys(map)
参数: map为map列名
说明: 获取map数据每行的Key
示例:
select mapKeys(m) from map_table; ┌─mapKeys(m)──┐ │ ['k1','k2'] │ │ ['k2','k3'] │ └─────────────┘
注意:
对于Implicit Map和Implicit Compact Map类型,此方法会先查询map列,然后筛出其中的key返回,因此需要在参数allow_map_access_without_key为true的情况下使用。效率较低,不建议使用,建议使用下面的getMapKeys方法。
对于KV Map类型,此方法会直接查询.key文件。
语法: mapValues(map)
参数: map为map列名
说明: 获取map数据每行的Value
示例:
select mapValues(m) from map_table; ┌─mapValues(m)─┐ │ ['v1','v2'] │ │ ['v20','v3'] │ └──────────────┘
注意:
对于Byte Map和Byte Compact Map类型,此方法会先查询map列,然后筛出其中的key返回,因此需要在参数allow_map_access_without_key为true的情况下使用,效率较低。
对于KV Map类型,此方法会直接查询**.value**文件。
语法: mapContains(map, key)
参数: map为map列名,key为待查询的key名
说明:返回map列的每行是否包含目标key
示例:
select mapContains(m, 'k1') from map_table; ┌─mapContains(m, 'k1')─┐ │ 1 │ │ 0 │ └──────────────────────┘
注意:
此方法会先查询map列,因此需要在参数allow_map_access_without_key为true的情况下使用。
语法: getMapKeys('database', 'table', 'map'[, 'partition_regex'])
参数: database为库名,table为表名(可以是分布式表名),map为列名,partition_regex为分区的正则表达式
说明: 获取map列的key set
示例:
select getMapKeys('default', 'map_table', 'm') ┌─getMapKeys('default', 'map_table', 'm')─┐ │ ['k1','k2','k3'] │ └─────────────────────────────────────────┘
注意: 此方法会直接从checksum中获取key信息,因此仅适用于Implicit Map和Implicit Compact Map类型
语法: str_to_map(string, item_delimiter, kv_delimiter)
参数: string为待解析的字符串,item_delimiter为数据之间的分隔符,kv_delimiter为每条数据中key和value的分隔符
说明: 解析字符串构造map
示例:
SELECT str_to_map('a=b&c=d', '&', '='); ┌─str_to_map('a=b&c=d', '&', '=')─┐ │ {'a':'b','c':'d'} │ └─────────────────────────────────┘
收集所有键并对相应的值求和。
语法
mapAdd(arg1, arg2 [, ...])
参数
参数为多个 map 列或两个 arrays 的元组,其中第一个数组中的元素表示键,第二个数组包含每个键的值。所有键数组应具有相同的类型,所有值数组应包含可以提升到同一种类型 (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(Tuple(Array, Array), Tuple(Array, Array) [, ...])
参数
参数为多个 map 列或两个 arrays 的元组,其中第一个数组中的元素表示键,第二个数组包含每个键的值。所有键数组应具有相同的类型,所有值数组应包含可以提升到同一种类型(Int64、UInt64 或 Float64)的项。公共提升类型用作结果数组的类型。
返回值
示例
查询使用 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)) │ └───────────────┴─────────────────────┘
填充具有整数键的映射中缺失的键值对。 为了支持键扩展到超出最大值,可以指定一个最大键。 具体来说,该函数返回一个映射,其中键形成从最小键到最大键(或指定的 max 参数)的系列,步长为 1,并有对应值。 如果没有为某个键指定值,则使用默认值作为该键的值。 如果键重复,只有第一个值(按出现顺序)与该键相关联。
语法
mapPopulateSeries(map[, max]) mapPopulateSeries(keys, values[, max])
对于数组参数,每行中 keys 和 values 的元素数量必须相同。
参数
参数为多个 map 列或两个 Arrays,其中第一个和第二个数组分别包含键和每个键的值。
映射数组:
map — 具有整数键的 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)) │ └──────────────────┴─────────────────────┘
语法:ALTER TABLE database.table CLEAR MAP KEY map(key1,[, key2, ... ])
参数: database为库名,table为表名,map为map名,key1,key2为key名
限制: KV Map不支持此功能
示例:
ALTER TABLE map_table CLEAR MAP KEY m('k1'); select * from map_table; ┌─id─┬─m──────────────────────┐ │ 1 │ {'k2':'v2'} │ │ 2 │ {'k2':'v20','k3':'v3'} │ └────┴────────────────────────┘