DuckDB-paimon 是由 PolarDB 团队开发的一款 DuckDB 扩展插件,允许通过 SQL 直接查询 Apache Paimon 表,无需任何 ETL 搬运,无需 Flink/Spark 集群,打开 DuckDB Shell 即可对 Paimon 表执行 SQL 分析。

近期发布 v0.0.3-variegata 版本带来了一项系统性的改进:谓词下推(Predicate Pushdown)能力的全面覆盖。

谓词下推意味着什么

"谓词"这个词听起来有些学术,其实就是 SQL 中 WHERE 后面的那些过滤条件,比如 WHERE age > 18 或 WHERE region = 'cn-hangzhou'。

当 DuckDB 通过 duckdb-paimon 查询一张 Paimon 表时,有两种处理方式:

方式一(没有谓词下推):DuckDB 向 Paimon 发起请求,Paimon 把表里所有的数据都从数据湖存储层读出来,通过网络传给 DuckDB,再由 DuckDB 的执行器在内存里逐行检查哪些符合 WHERE 条件。如果这张表有 1 亿行,哪怕最终只需要 1000 行,也得先把 1 亿行全部搬过来。

方式二(有谓词下推):DuckDB 在发起请求的同时,把 WHERE 条件也一并告知 Paimon。Paimon 在自己的存储层读取文件时,就能利用列式存储的文件级统计信息(比如每个文件中某列的最小值/最大值),直接跳过那些肯定不包含目标数据的文件,甚至在行组(row group)级别提前过滤,只把可能命中的数据传出来。

Paimon 的数据通常存放在对象存储(如阿里云 OSS、AWS S3)上,每次 I/O 都有网络开销。谓词下推减少的不只是计算量,更是从 Paimon 数据湖存储层实际读出的数据量本身。对于存储在对象存储上的大表,这个差别非常明显——扫描 1 TB 和扫描 100 GB,不只是速度上的区别,也是存储读取成本上的区别。

v0.0.2 已经具备了基本的扫描能力,但谓词下推覆盖还不完整。v0.0.3 把这部分补全,覆盖了日常 SQL 里最常见的那几类过滤条件。

谓词下推意味着什么新增支持的谓词类型

比较运算符
=、!=、<、>、<=、>= 这几个基础运算符现在都能下推。这是最高频的过滤场景,比如:

SELECT * FROM paimon_table WHERE age > 18;
SELECT * FROM paimon_table WHERE status != 'deleted';

NULL 判断

SELECT * FROM paimon_table WHERE email IS NULL;
SELECT * FROM paimon_table WHERE phone IS NOT NULL;

BETWEEN
范围查询是时序数据和日志表里最常见的过滤方式:

SELECT * FROM paimon_table WHERE event_time BETWEEN '2026-01-01' AND '2026-04-01';

NOT BETWEEN 同样支持。

IN / NOT IN

SELECT * FROM paimon_table WHERE region IN ('cn-hangzhou', 'cn-shanghai');
SELECT * FROM paimon_table WHERE category NOT IN ('test', 'demo');

LIKE
字符串前缀、后缀、模糊匹配:

SELECT * FROM paimon_table WHERE name LIKE 'Zhang%';

AND / OR 逻辑组合

多个条件组合后整体下推,DuckDB 解析出的谓词树按原结构传递给 Paimon:

SELECT * FROM paimon_table
WHERE region = 'cn-hangzhou'  
AND event_time >= '2026-04-01'  
AND status IN ('active', 'pending');

AND 和 OR 的嵌套组合均支持。

其他改动

**
安全修复**:Paimon secret 中的 key_id 字段现在会在日志和错误信息中自动脱敏,避免敏感凭据被意外打印。

DuckDB 升级:底层 DuckDB 从 v1.5.1 升级至 v1.5.2。

获取方式

点击下方阅读原文,从 [GitHub Releases] 下载 Linux amd64 或 arm64 预编译包。也可参考项目 README 从源码构建。本期互动评论区分享您的应用场景和使用体验,截至4月28日(含),留言且留言处点赞数前三,随机赠送社区礼品。
图片

标签: none

添加新评论