未记录事实核验 · 状态:维护中
记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。
warning 适用边界与维护说明
本文适合作为Spark集成Paimon、批量读写、历史查询及运维操作的流程参考,不是可直接执行的完整项目。依赖部分仅列出对应Spark版本的jar名称,未明确Paimon发行版本,也未限定历史查询、Structured Streaming读取、行级DML及系统过程的版本与表类型支持条件;执行前需针对目标环境确认。orders、target_table和source_table未提供建表定义,覆写查询含占位内容,各段代码应按独立示例理解并补齐所需材料。正文已区分追加表与主键表的INSERT语义,并明确覆写必须包含目标范围内全部应保留的数据,这两项不再作为未解决错误。本次仅作全文结构与适用边界审阅,未进行外部事实核验或运行验证。
⚡ Paimon与Spark集成 - 批量处理与SQL查询
abstract 📋 本节概览
- 🎯 学习目标:掌握使用Spark进行Paimon数据的批量读写和复杂分析
- 📚 前置知识:Paimon与Flink集成
- ⏱️ 预计用时:25分钟
- 🔧 核心内容:Spark Catalog配置、MERGE INTO语法、Time Travel查询、结构化流
- 💡 关键收获:利用Spark强大的计算能力进行复杂ETL和OLAP分析
🎯 为什么需要 Spark + Paimon?
虽然Flink是Paimon流式写入的最佳搭档,但Spark在以下场景中具有不可替代的优势:
- 复杂OLAP查询:Spark SQL的优化器非常成熟,适合处理大规模数据的Join和聚合。
- 批量数据修正:使用
MERGE INTO或UPDATE批量修复历史数据。 - 离线数仓ETL:处理T+1的离线报表任务。
- AI/ML集成:读取Paimon数据进行机器学习模型训练。
⚙️ 环境集成 (Configuration)
1. 依赖准备
下载对应的 paimon-spark jar包,并放入Spark的 jars 目录或通过 --packages 指定。
paimon-spark-3.5.jar(对应Spark 3.5)paimon-spark-3.3.jar(对应Spark 3.3)
2. Catalog配置
在 spark-defaults.conf 或启动命令中配置Catalog。
spark-sql \
--conf spark.sql.catalog.paimon=org.apache.paimon.spark.SparkCatalog \
--conf spark.sql.catalog.paimon.warehouse=hdfs://namenode:8020/paimon \
--conf spark.sql.extensions=org.apache.paimon.spark.extensions.PaimonSparkSessionExtensions
tip 扩展项
PaimonSparkSessionExtensions 是可选的,但强烈建议添加。它提供了Paimon特有的SQL语法扩展(如 CALL sys.compact)。
📖 数据读取 (Query)
1. 标准SQL查询
USE paimon.default;
SELECT region, sum(sales)
FROM orders
GROUP BY region;
2. Time Travel (历史回溯)
Spark SQL支持标准的 VERSION AS OF 或 TIMESTAMP AS OF 语法。
-- 查询快照ID为 10 的数据
SELECT * FROM orders VERSION AS OF 10;
-- 查询 2024-01-01 12:00:00 的数据
SELECT * FROM orders TIMESTAMP AS OF '2024-01-01 12:00:00';
3. 结构化流 (Structured Streaming)
Spark Structured Streaming 也可以流式读取Paimon。
val df = spark.readStream
.format("paimon")
.load("hdfs://namenode:8020/paimon/default.db/orders")
df.writeStream
.format("console")
.start()
✍️ 数据写入与维护 (Write & DML)
Spark提供了比Flink更丰富的批量DML语法。
1. 批量写入
-- INSERT写入:追加表追加记录;主键表按主键及表配置处理写入,不等同于仅追加
INSERT INTO orders VALUES (1, 'book', 100);
-- Overwrite覆写 (重跑分区)
INSERT OVERWRITE orders PARTITION (dt='2024-01-01')
SELECT ... FROM source_table;
2. 复杂更新 (MERGE INTO)
这是Spark的一大杀器,适合行级更新、CDC重放等场景。
MERGE INTO target_table AS t
USING source_table AS s
ON t.id = s.id
WHEN MATCHED THEN
UPDATE SET t.name = s.name, t.price = s.price
WHEN NOT MATCHED THEN
INSERT (id, name, price) VALUES (s.id, s.name, s.price);
3. 删除与更新
-- 删除符合条件的数据
DELETE FROM orders WHERE dt < '2023-01-01';
-- 更新数据
UPDATE orders SET status = 'archived' WHERE dt < '2023-01-01';
warning 性能提示
DELETE 和 UPDATE 在Paimon中是重操作(特别是对于主键表),可能会产生大量Writer消耗。大批量操作可评估使用 INSERT OVERWRITE,但须明确整表或分区覆写范围,并生成该范围内全部应保留的数据;不能仅写入变更行。
🔧 系统运维 (Procedures)
通过Spark SQL可以直接调用Paimon的存储过程,进行运维操作。
-- 1. 手动触发合并 (Compaction)
CALL paimon.sys.compact('default.orders');
-- 2. 清理过期快照
CALL paimon.sys.expire_snapshots('default.orders');
-- 3. 创建Tag
CALL paimon.sys.create_tag('default.orders', 'v1.0');
📋 本节要点回顾
✅ 核心技能掌握检查
- [ ] 能够配置 Spark Catalog 访问 Paimon
- [ ] 掌握
VERSION AS OF进行历史查询 - [ ] 会使用
MERGE INTO进行复杂数据同步 - [ ] 知道如何通过
CALL执行Paimon运维命令
🔗 学习路径连接
已完成:✅ 11-Flink集成 → ✅ 12-Spark集成 下一步:Paimon性能调优 - 压榨系统性能的极限
tip 最佳实践
"流写批读"是Paimon最经典的架构:
- 使用 Flink 进行秒级实时写入和简单ETL。
- 使用 Spark 进行复杂的T+1离线分析、数据修正和定期Compaction。
创建时间:2024-12-05 最后更新:2024-12-05 学习时长:25分钟 难度等级:⭐⭐ (中级)
#Paimon #Spark #OLAP #DataLake #批处理