You need to enable JavaScript to run this app.
导航
Map 函数(自研)
最近更新时间:2025.07.07 11:07:15首次发布时间:2022.12.15 10:08:27
复制全文
我的收藏
有用
有用
无用
无用

arrayElement(查询key)

语法: 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(查询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

语法: 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

语法: 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

语法: 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

语法: 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

语法: 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

语法: 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

收集所有键并对相应的值求和。
语法

mapAdd(arg1, arg2 [, ...])

参数
参数为多个 map 列或两个 arrays 的元组,其中第一个数组中的元素表示键,第二个数组包含每个键的值。所有键数组应具有相同的类型,所有值数组应包含可以提升到同一种类型 (Int64、UInt64 或 Float64)的项。公共提升类型用作结果数组的类型。
返回值

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

示例
查询使用 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) [, ...])

参数
参数为多个 map 列或两个 arrays 的元组,其中第一个数组中的元素表示键,第二个数组包含每个键的值。所有键数组应具有相同的类型,所有值数组应包含可以提升到同一种类型(Int64、UInt64 或 Float64)的项。公共提升类型用作结果数组的类型。
返回值

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

示例
查询使用 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

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

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

对于数组参数,每行中 keysvalues 的元素数量必须相同。
参数
参数为多个 map 列或两个 Arrays,其中第一个和第二个数组分别包含键和每个键的值。
映射数组:

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

  • keys — 键数组。 Array(Int) 类型。
  • values — 值数组。 Array(Int) 类型。
  • max — 最大键值。可选。 Int8、Int16、Int32、Int64、Int128、Int256 类型。

返回值

  • 根据参数返回一个 Map 或两个 Arrays 的元组:排序后的键,以及相应键的值。

示例
查询使用 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)) │
└──────────────────┴─────────────────────┘

删除Map Key

语法: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'} │
└────┴────────────────────────┘