适用版本:Doris 2.1.0+(正式支持 Map + Lambda 高阶函数)
一、基础语法
两种合法入参顺序(都能执行,推荐第一种标准写法)
sql
-- 标准写法(推荐:集合在前,Lambda 在后)
map_filter(map_expr, (k, v) -> boolean_condition)
-- 兼容写法(Lambda 在前,集合在后,不推荐)
map_filter((k, v) -> boolean_condition, map_expr)
参数说明
- map_expr 待过滤的
Map类型字段 / 表达式,可为列、map()常量、map_keys()结果等。 - Lambda 表达式
(k, v) -> 布尔条件k:遍历中当前键(key)v:遍历中当前值(value)- 表达式最终必须返回 布尔值 (
true/false)
- 返回值 新
Map,仅保留 Lambda 结果为true的键值对;无匹配项返回空Map;原 Map 为NULL则返回NULL。
二、准备测试表 & 数据
sql
CREATE TABLE test_map_demo (
id INT,
info Map<String, INT>
) DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1;
INSERT INTO test_map_demo VALUES
(1, map('a', 10, 'b', 20, 'c', 30)),
(2, map('x', 5, 'y', 15)),
(3, map('k1', NULL, 'k2', 100)),
(4, map()); -- 空Map
三、常用示例
1. 按 value 过滤(最常用)
保留 value 大于 10 的键值对
sql
SELECT
id,
info,
map_filter(info, (k, v) -> v > 10) AS res_map
FROM test_map_demo;
2. 按 key 过滤
只保留 key 为 b、y 的数据
sql
SELECT
id,
map_filter(info, (k, v) -> k IN ('b', 'y')) AS res_map
FROM test_map_demo;
3. key + value 组合条件
sql
SELECT
id,
map_filter(info, (k, v) -> k != 'a' AND v < 30) AS res_map
FROM test_map_demo;
4. 过滤 NULL 值
剔除 value 为 NULL 的键值对
sql
SELECT
id,
map_filter(info, (k, v) -> v IS NOT NULL) AS res_map
FROM test_map_demo WHERE id = 3;
5. 结合数组函数(你的业务场景)
判断 key 存在于指定数组中,实现Map 交集过滤
sql
-- 保留 pre.index_map 中 key 同时存在于 dy_0.index_map 的键值对
SELECT
map_filter(
pre.index_map,
(k, v) -> array_contains( coalesce(map_keys(dy_0.index_map), []), k )
) AS result_map
FROM pre, dy_0;
四、搭配常用函数
map_filter+map_size:统计过滤后键值对数量
sql
SELECT
id,
map_size(map_filter(info, (k, v) -> v > 10)) AS cnt
FROM test_map_demo;
map_filter+explode_map:过滤后拆分成行
sql
SELECT
id, k, v
FROM test_map_demo
LATERAL VIEW explode_map( map_filter(info, (k, v) -> v > 10) ) t AS k, v;
coalesce兜底 :防止 Map 为NULL报错
sql
map_filter( coalesce(info, map()), (k, v) -> v > 10 )
五、核心注意事项
-
版本限制 2.1.0 以下版本不支持 Lambda + map_filter,会报语法错误。
-
Lambda 格式硬性要求
- 必须写两个参数
(k, v),不能只写一个; - 箭头
->符号不能写错。
- 必须写两个参数
-
类型匹配 条件里对
k/v的运算,类型要和原 Map 定义一致,避免类型报错。 -
两种入参顺序说明 Doris 兼容
(Map, Lambda)和(Lambda, Map)两种写法,都不报错;统一使用Map 在前标准写法,可读性和兼容性更好。 -
与
array_filter区分(快速记忆)array_filter:处理数组,Lambda 单参数x -> 条件,返回数组map_filter:处理 Map,Lambda 双参数(k,v) -> 条件,返回 Map
六、最简模板(直接套用)
sql
-- 通用模板
map_filter( Map字段, (k, v) -> 过滤条件 )