Databricks Delta Live Table读取Parquet文件产生重复记录咨询
问题分析与解决方法
核心原因
你的操作问题出在流式表的特性和缺少文件处理跟踪配置:
- STREAMING LIVE TABLE 是为持续新增的文件流设计的,默认不会记录已处理的文件。如果作业重复运行(哪怕是误触发),会重新读取同一个Parquet文件,导致重复插入。
- 没有配置
cloudFiles.schemaLocation参数,Databricks无法跟踪哪些文件已经被处理过,每次运行都会全量扫描文件夹内的所有文件并加载。
解决办法
方法1:添加文件处理跟踪配置
修改DLT代码,指定cloudFiles.schemaLocation(可以是DBFS或ADLS上的路径),让系统记录已处理文件的元数据,避免重复加载:
CREATE OR REFRESH STREAMING LIVE TABLE Asset AS SELECT * FROM cloud_files( "abfss://datalake@storageaccountname.dfs.core.windows.net/loading/Settlement/dbo/Asset", "parquet", map( "cloudFiles.inferColumnTypes", "true", "cloudFiles.schemaLocation", "abfss://datalake@storageaccountname.dfs.core.windows.net/metadata/asset_schema_tracking" ) )
注意:
schemaLocation路径需要是一个不会被清理的位置,用来存储文件处理的状态信息。
方法2:改用静态Live Table(更适合一次性加载场景)
如果你的数据源是一次性的(只有这一个Parquet文件,后续不会新增),完全没必要用流式表,直接用静态Live Table即可:
CREATE OR REFRESH LIVE TABLE Asset AS SELECT * FROM parquet.`abfss://datalake@storageaccountname.dfs.core.windows.net/loading/Settlement/dbo/Asset`
临时修复:清理重复数据
如果已经产生了重复记录,可以先清理表中重复数据,再按上面的方法重新加载:
CREATE OR REFRESH LIVE TABLE Asset_cleaned AS SELECT DISTINCT * FROM LIVE.Asset;
内容的提问来源于stack exchange,提问作者Leslie
相关产品推荐
相关产品推荐

