使用Merge-on-Read时如何指定等值/位置删除及选型?(Spark3.3 EMR)
Iceberg等值删除与位置删除的配置及选型(EMR Spark 3.3)
一、如何指定删除方式
Iceberg的两种删除方式不是通过全局表属性固定配置,而是通过会话级Spark配置或写操作选项来指定,同时结合删除语句的条件类型生效:
1. 等值删除(Equality Deletes)
等值删除针对明确的等值匹配条件(如id = 1、id IN (2,3)),需要主动开启对应模式:
- 会话级全局配置:初始化Spark会话时设置,后续所有删除操作默认使用等值模式
# Python spark.conf.set("spark.sql.iceberg.delete.mode", "equality")// Scala spark.conf.set("spark.sql.iceberg.delete.mode", "equality") - 单操作级配置:仅对当前删除任务生效,适合临时切换模式
# Python DataFrame API delete_df = spark.createDataFrame([(100,), (200,)], ["id"]) delete_df.writeTo("your_iceberg_table")\ .option("delete.mode", "equality")\ .delete()// Scala DataFrame API val deleteDF = spark.createDataFrame(Seq((100), (200))).toDF("id") deleteDF.writeTo("your_iceberg_table") .option("delete.mode", "equality") .delete() - 用SQL执行时,只要开启上述任一配置且删除条件为等值匹配,就会生成等值删除文件。
2. 位置删除(Position Deletes)
位置删除是默认删除方式,无需额外配置,满足以下场景自动触发:
- 删除条件为非等值匹配(如
age > 30、date < '2023-01-01') - 未开启等值删除模式,即使使用等值条件也会生成位置删除
示例SQL:
-- 默认生成位置删除 DELETE FROM your_iceberg_table WHERE age > 30
二、删除方式选型指南
优先选等值删除的场景
- 删除逻辑基于明确的等值条件(如按主键、业务唯一键删除指定记录)
- 希望降低Merge-on-Read模式下的读开销:等值删除文件体积更小,读操作时可快速过滤命中的记录
- 表的日常查询频繁基于删除条件中的列做过滤
优先选位置删除的场景
- 删除条件为范围查询、模糊匹配等非等值逻辑
- 待删除记录在数据文件中分散分布,无法通过等值条件高效定位
- 计划短期内对表执行
OPTIMIZE操作(会将删除文件与数据文件合并,消除删除开销)
三、与Merge-on-Read模式的配合
你提到的Merge-on-Read模式可通过表属性write.merge.mode=merge-on-read开启,开启后两种删除方式都会生成独立的删除文件(而非立即修改原始数据文件),后续读操作会自动合并数据文件与删除文件的结果,无需手动触发合并。
内容的提问来源于stack exchange,提问作者Peter Connolly
相关产品推荐
相关产品推荐

