You need to enable JavaScript to run this app.
导航

Map 函数(自研)

最近更新时间2023.05.30 11:57:22

首次发布时间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

mapSubtract

mapPopulateSeries

删除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'} │
└────┴────────────────────────┘