Delta表去重SQL报错:AssertionError: assertion failed: No plan for DeleteFromTable
Delta表删除重复记录报错的解决方法
你用CTE删除重复记录的方式在Delta Lake里不生效,因为Delta不支持直接从CTE执行DELETE操作——CTE是临时逻辑视图,没有对应的物理存储执行计划,所以会抛出AssertionError: assertion failed: No plan for DeleteFromTable错误。
下面是两种可行的解决方式:
方式一:直接用DELETE结合子查询
通过子查询标记出重复的记录,直接对基表执行删除:
DELETE FROM tablename WHERE (columnname, your_unique_identifier) IN ( SELECT columnname, your_unique_identifier, ROW_NUMBER() OVER (PARTITION BY columnname ORDER BY columnname) AS row_num FROM tablename ) AND row_num > 1;
注意:your_unique_identifier需要是表中的唯一字段(比如主键、自增ID),用来精准定位要删除的重复行,避免误删。如果没有唯一ID,可以用所有字段的组合来匹配,但效率会低一些。
方式二:使用MERGE INTO(Delta推荐方式)
MERGE是Delta Lake优化过的操作,适合处理批量数据修改,去重效率更高:
MERGE INTO tablename AS target USING ( SELECT *, ROW_NUMBER() OVER (PARTITION BY columnname ORDER BY columnname) AS row_num FROM tablename ) AS source -- 匹配条件要确保能精准定位到重复行,这里用分组字段+行号 ON target.columnname = source.columnname AND target.your_unique_identifier = source.your_unique_identifier WHEN MATCHED AND source.row_num > 1 THEN DELETE;
如果表中没有唯一标识字段,也可以调整PARTITION BY和ORDER BY的逻辑,比如按所有可能的重复字段分组,按某个时间字段排序保留最新/最早的一条,然后删除其余的。
内容的提问来源于stack exchange,提问作者Nibu Jose
相关产品推荐
相关产品推荐

