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

如何解决Azure Data Explorer中的重复数据插入问题?

解决ADF复制ADLS数据到ADX的重复问题及Upsert支持说明

一、解决重复数据的方案

1. 利用ADF增量复制功能

  • 直接在ADF复制活动中启用增量复制,基于文件的「最后修改时间」筛选:每次管道运行时,只处理上次运行后新增的文件(刚好匹配源文件每两小时生成的周期)。
  • 如果文件名包含可识别的时间戳(比如log_20240520_1400.csv),也可以通过文件名筛选器(通配符或参数化路径)指定仅处理当前周期的新文件,避免读取旧文件。

2. ADX端前置去重

  • 设置唯一键约束:创建ADX表时指定uniqueKey,摄取时自动跳过重复键的记录。示例Kusto命令:
    .create table Logs (Timestamp:datetime, LogId:string, Content:string) with (uniqueKey = 'LogId')
    
    注意:唯一键约束仅对新摄取的数据生效,已存在的重复数据需要手动清理。
  • 通过更新策略自动去重:先将数据导入临时 staging 表,再创建更新策略,用deduplicate函数基于唯一标识(如LogId或内容哈希)写入目标表。示例:
    .alter table Logs policy update @'[{"Source": "TempLogs", "Query": "TempLogs | deduplicate LogId", "IsEnabled": true}]'
    

3. 维护已处理文件清单

  • 在ADLS或Azure SQL中创建一个记录表,记录已成功复制的文件名/路径。每次管道运行前,先查询该清单,筛选出源文件夹中未记录的文件进行复制;复制完成后,将新文件的信息写入清单。这种方式适合文件名无规律的场景。

二、ADX的Upsert支持

ADX原生支持Upsert操作,主要有两种实现方式:

  • 使用.merge命令:基于指定键匹配记录,存在则更新,不存在则插入。示例:
    .merge into Logs Target
    using (
        select Timestamp, LogId, Content from TempIngestLogs // 待处理的数据源
    ) Source
    on Target.LogId = Source.LogId
    when matched then update set Target.Content = Source.Content, Target.Timestamp = Source.Timestamp
    when not matched then insert (Timestamp, LogId, Content) values (Source.Timestamp, Source.LogId, Source.Content)
    
  • 结合更新策略实现自动Upsert:将数据先导入临时表,然后配置更新策略,通过.merge逻辑自动同步到目标表,无需手动执行命令。

内容的提问来源于stack exchange,提问作者Master_GoGo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:43:19