You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:11:16