在 Azure 数据资源管理器中处理重复数据

将数据发送到云的设备维护数据的本地缓存。 根据数据大小,本地缓存可能会存储数天甚至数月的数据。 你想要保护分析数据库免受设备故障,这些设备重新发送缓存的数据并导致分析数据库中的数据重复。 重复项可能会影响查询返回的记录数。 如果需要精确计数记录(例如在对事件进行计数)时,此问题是相关的。 本文概述了处理这些类型的方案重复数据的最佳做法。

处理重复数据的最佳解决方法是防止重复。 如果可能,请修复数据管道前面的问题。 此方法可节省与数据管道中的数据移动相关的成本,并避免在应对系统中引入重复数据时花费资源。 但是,在无法修改源系统的情况下,可以使用各种方法来解决此问题。

了解重复数据造成的影响

监视重复数据的百分比。 发现重复数据的百分比后,可以分析问题和业务影响的范围,并选择适当的解决方案。

用于识别重复记录百分比的示例查询:

let _sample = 0.01; // 1% sampling
let _data =
DeviceEventsAll
| where EventDateTime between (datetime('10-01-2018 10:00') .. datetime('10-10-2018 10:00'));
let _totalRecords = toscalar(_data | count);
_data
| where rand()<= _sample
| summarize recordsCount=count() by hash(DeviceId) + hash(EventId) + hash(StationId)  // Use all dimensions that make row unique. Combining hashes can be improved
| summarize duplicateRecords=countif(recordsCount  > 1)
| extend duplicate_percentage = (duplicateRecords / _sample) / _totalRecords  

用于处理重复数据的解决方法

解决方案 1:请勿删除重复数据

了解对重复数据的业务要求和容忍度。 某些数据集可以处理特定百分比的重复数据。 如果重复的数据没有重大影响,则可以忽略其存在。 不删除重复数据的优点是,它不会增加引入过程或查询性能的额外开销。

解决方案 2:在查询期间处理重复行

另一种做法是在查询过程中筛选出数据中的重复行。 可以使用 arg_max() 聚合函数筛选出重复记录,并根据时间戳(或其他列)返回最后一条记录。 使用此方法的优点是加快引入速度,因为重复数据删除发生在查询期间。 此外,所有记录(包括重复项)都可用于审核和故障排除。 使用 arg_max 函数的缺点是每次查询数据时,CPU 上的额外查询时间和负载。 根据正在查询的数据量,此解决方案可能会变得非功能或占用内存,并且需要切换到其他选项。

在以下示例中,我们将查询针对一组列引入的最后一条记录来确定唯一的记录:

DeviceEventsAll
| where EventDateTime > ago(90d)
| summarize hint.strategy=shuffle arg_max(EventDateTime, *) by DeviceId, EventId, StationId

还可以将此查询放在函数中,而不是直接查询表:

.create function DeviceEventsView
{
    DeviceEventsAll
    | where EventDateTime > ago(90d)
    | summarize arg_max(EventDateTime, *) by DeviceId, EventId, StationId
}

解决方案 3:使用具体化视图删除重复数据

可以使用具体化视图进行重复数据删除,方法是使用take_any()//arg_max() 聚合函数(请参阅具体化视图创建命令中的示例 #4)。

注意

物化视图会消耗群集资源,这消耗可能不容忽视。 有关详细信息,请参阅具体化视图性能注意事项

解决方案 4:使用软删除删除重复项

软删除 支持删除单个记录的功能,因此你可以使用它删除重复项。 仅在不经常需要删除时使用此选项,而不是在需要不断去重所有传入记录时使用。

选择是使用具体化视图还是软删除进行重复数据删除

考虑以下因素来选择具体化视图和软删除以进行重复数据删除:

  • 管理和编排:具体化视图是一种完全托管的解决方案。 您仅需定义一次视图,之后系统将自动处理所有传入记录的重复数据删除。 软删除需要进行编排和管理。 如果具体化视图适用于你的用例,请选择此选项。
  • 当记录被去重时:使用软删除,首先将重复记录添加到表中,然后删除它们。 因此,在引入和软删除进程之间,表包含重复项。 使用具体化视图时,视图中的记录始终是去重的,因为系统在它们进入视图之前对它们进行去重处理。
  • 频率:如果需要持续去重表,请使用物化视图。 如果重复项不常见,并且你可以在引入期间识别它们,则软删除过程通常的性能优于具体化视图。 例如,如果引入通常没有重复项,但偶尔包含已知包含重复项的流,最好使用软删除来处理这些重复项,而不是定义不断尝试删除 所有 记录的具体化视图。

解决方案 5:ingest-by 区块标记

可以使用 'ingest-by:' 标记 来防止摄入过程中出现重复数据。 此解决方案仅在每个引入批处理没有重复项的用例中相关,并且仅当同一引入批处理多次引入时,才会发生重复项。

总结

可以通过多种方式处理数据重复。 仔细评估这些选项,考虑到价格和性能,以确定最适合你的业务的方法。