Apache Doris map_filter 用法

适用版本: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)

参数说明

  1. map_expr 待过滤的 Map 类型字段 / 表达式,可为列、map() 常量、map_keys() 结果等。
  2. Lambda 表达式 (k, v) -> 布尔条件
    • k:遍历中当前键(key)
    • v:遍历中当前值(value)
    • 表达式最终必须返回 布尔值 (true/false)
  3. 返回值 新 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;

四、搭配常用函数

  1. map_filter + map_size:统计过滤后键值对数量

sql

复制代码
SELECT
    id,
    map_size(map_filter(info, (k, v) -> v > 10)) AS cnt
FROM test_map_demo;
  1. 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;
  1. coalesce 兜底 :防止 Map 为 NULL 报错

sql

复制代码
map_filter( coalesce(info, map()), (k, v) -> v > 10 )

五、核心注意事项

  1. 版本限制 2.1.0 以下版本不支持 Lambda + map_filter,会报语法错误。

  2. Lambda 格式硬性要求

    • 必须写两个参数 (k, v),不能只写一个;
    • 箭头 -> 符号不能写错。
  3. 类型匹配 条件里对 k/v 的运算,类型要和原 Map 定义一致,避免类型报错。

  4. 两种入参顺序说明 Doris 兼容 (Map, Lambda) 和 (Lambda, Map) 两种写法,都不报错;统一使用 Map 在前 标准写法,可读性和兼容性更好。

  5. 与 array_filter 区分(快速记忆)

    • array_filter:处理数组,Lambda 单参数 x -> 条件,返回数组
    • map_filter:处理 Map,Lambda 双参数 (k,v) -> 条件,返回 Map

六、最简模板(直接套用)

sql

复制代码
-- 通用模板
map_filter( Map字段, (k, v) -> 过滤条件 )
相关推荐
herinspace11 小时前
管家婆实用贴-SQL 2008如何修改成混合模式
服务器·数据库·sql·管家婆软件·财务软件·合肥管家婆软件
大模型最新论文速读13 小时前
text-to-sql:从学术玩具到生产落地
数据库·sql
Decay__14 小时前
15_MySQL 数据同步与迁移方案 —— 复制 / DataX / Canal / 异构同步(对标 Oracle GoldenGate)
运维·数据库·sql·mysql·架构
zjx238815 小时前
oracle11g转Gbase8s库SQL常见问题修改
数据库·sql
杨云龙UP16 小时前
Oracle 同义词(SYNONYM)详解及 Toad for Oracle SQL 智能补全配置实战
运维·数据库·sql·oracle·同义词·toad·toad for oracle
Decay__16 小时前
17_MySQL 监控体系构建 —— mysqld_exporter + Prometheus + Grafana 全栈实战
运维·数据库·sql·mysql·架构
w-w0w-w1 天前
SQL注入
网络·数据库·sql
宇宙无敌暴龙战士6661 天前
MySQL 8 库表操作学习笔记:SQL 基础、库表管理、约束与用户授权全流程
数据库·sql·mysql·学习笔记·后端开发
对空六课1 天前
埋点上报太频繁拖性能,先做批量合并和时机控制
sql·工具选型·数据上报·埋点方案·sdk接入
java_nnnn2 天前
Spring IoC & DI 从入门到理解:控制反转、依赖注入与 Bean 管理详解
数据库·sql·spring