「DuckDB-Paimon实操」6分钟上手,数据湖分析快人一步
DuckDB-paimon 是由 PolarDB 团队开发的一款 DuckDB 扩展插件,让 DuckDB 能够直接读取和查询 Apache Paimon 格式的数据湖表,无需任何 ETL 搬运,无需 Flink/Spark 集群,打开 DuckDB Shell 即可对 Paimon 表执行 SQL 分析。 技术交流钉群:164165020808 直接读取 Paimon 表 远程 OSS 存储支持 Projection Pushdown(列裁剪下推) 查询时只读取 SQL 中实际用到的列,大幅减少 I/O 开销,在宽表场景下效果尤为显著: 作为 Catalog 挂载(ATTACH) 实时湖仓的轻量即席查询 构建 --recurse-submodules 会同时拉取 DuckDB 和 paimon-cpp 子模块,是构建所必需的。 运行 查询本地 Paimon 表 查询 OSS 上的 Paimon 表DuckDB-paimon核心能力
无需任何中间转换,直接通过 SQL 查询 Paimon 表数据:-- 通过完整路径读取
SELECT * FROM paimon_scan('./data/testdb.db/testtbl');
-- 通过 warehouse / database / table 三段式读取
SELECT * FROM paimon_scan('/warehouse', 'mydb', 'orders');
通过 DuckDB 的 Secret 机制,安全配置阿里云 OSS 访问凭证,直接查询存储在 OSS 上的 Paimon 数据湖:-- 配置 OSS 访问凭证
CREATE SECRET paimon_oss (
TYPE paimon,
key_id 'your-access-key-id',
secret 'your-access-key-secret',
endpoint 'oss-cn-hangzhou.aliyuncs.com'
);
-- 直接查询 OSS 上的 Paimon 表
SELECT COUNT(*), region
FROM paimon_scan('oss://my-bucket/warehouse', 'sales_db', 'orders')
GROUP BY region
ORDER BY COUNT(*) DESC;-- 只会读取 order_id 和 amount 两列的数据文件,其余列不会被读取
SELECT order_id, amount FROM paimon_scan('oss://...', 'db', 'orders');
将 Paimon warehouse 作为一个完整的 Catalog 挂载到 DuckDB,像操作本地数据库一样浏览 Paimon 的 Schema 和表结构:
•ATTACH 'oss://my-bucket/warehouse' AS paimon_lake (TYPE paimon);
SHOW ALL TABLES IN paimon_lake;
DESCRIBE paimon_lake.sales_db.orders;DuckDB-paimon核心能力
数据由 Flink 实时写入 Paimon,分析师用 DuckDB + Duckdb-paimon 直接在 OSS 上做即席(ad-hoc)查询,无需启动任何计算集群,查询延迟从分钟级降至秒级。
数据验证与质量检查
在 CI/CD 流水线中,用 DuckDB 对 Paimon 表做数据质量断言,验证 Flink 作业的输出结果是否符合预期,轻量、快速、无依赖。
数据探索与调试
数据工程师在开发 Flink 作业时,随时用 DuckDB Shell 查看 Paimon 表的当前状态,快速定位数据问题,效率远超启动 Flink SQL Client。
跨格式数据联邦查询
DuckDB 天然支持查询 Parquet、CSV、JSON、Iceberg 等多种格式,结合 Duckdb-paimon,可以将 Paimon 表与其他数据源做联邦 JOIN,无需数据搬运:
•-- Paimon 订单表 JOIN 本地 CSV 维表
SELECT o.order_id, o.amount, c.customer_name
FROM paimon_scan('oss://...', 'db', 'orders') o
JOIN read_csv('customers.csv') c ON o.customer_id = c.id;快速上手
•git clone --recurse-submodules https://github.com/polardb/duckdb-paimon.git
cd duckdb-paimon
GEN=ninja make
•./build/release/duckdb
•SELECT * FROM paimon_scan('./data/testdb.db/testtbl');
•CREATE SECRET my_oss (
TYPE paimon,
key_id 'your-ak',
secret 'your-sk',
endpoint 'oss-cn-hangzhou.aliyuncs.com'
);
SELECT * FROM paimon_scan('oss://your-bucket/warehouse', 'your_db', 'your_table');