處理 Azure Data Explorer 中的重複資料

傳送數據至雲端的裝置會維護數據的本機快取。 視數據大小而定,本機快取可能會儲存數天甚至數月的數據。 您想要保護您的分析資料庫,避免重新傳送快取資料的裝置故障,並在分析資料庫中造成數據重複。 重複專案可能會影響查詢所傳回的記錄數目。 當您需要精確的記錄計數,例如計算事件時,這會相關。 本主題概述處理這些案例類型重複數據的最佳做法。

數據重複的最佳解決方案是防止重複。 可能的話,請修正資料管線中稍早的問題,以節省與數據管線一起移動數據的成本,並避免花費資源處理內嵌到系統中的重複數據。 不過,在無法修改來源系統的情況下,有各種方式可處理此案例。

瞭解重複數據的影響

監視重複數據的百分比。 探索到重複數據的百分比之後,您可以分析問題的範圍和業務影響,然後選擇適當的解決方案。

用來辨識重複記錄百分比的範例查詢:

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_min()//arg_max() 聚合函數(請參閱範例 ?view=azure-data-explorer&preserve-view=true#4)。

注意

具體化檢視會產生耗用叢集資源的成本,這不可以忽略不計。 如需詳細資訊,請參閱具體化檢視 效能考慮

解決方案 #4:使用虛刪除移除重複專案

虛刪除 支援刪除個別記錄的功能,因此可用來刪除重複專案。 只有在不常刪除的情況下,才建議使用此選項,而如果您經常需要重複數據刪除所有傳入的記錄,則不建議使用此選項。

選擇具體化檢視和虛刪除重複數據刪除

有幾個考慮可協助您選擇使用具體化檢視或虛刪除進行重複數據刪除:

  • 管理和協調流程:具體化檢視是完全受控的解決方案。 檢視會定義一次,而且系統會處理所有傳入記錄的重複數據刪除。 虛刪除需要協調流程和管理。 因此,如果具體化檢視適用於您的使用案例,您應該一律選擇此選項。
  • 當重複數據刪除記錄時:使用虛刪除時,重複的記錄會先新增至數據表並加以刪除;因此,在擷取和虛刪除程式之間,數據表包含重複專案。 使用具體化檢視時,檢視中的記錄一會重複數據刪除,因為它們會在進入檢視之前進行重複數據刪除
  • 頻率:如果數據表需要持續重複數據刪除,請使用具體化檢視。 如果您預期重複專案不常發生,而且您可以在擷取期間識別這些重複專案,虛刪除程式通常的執行效能會優於具體化檢視。 例如,如果您的擷取通常沒有重複專案,但偶爾會擷取已知包含重複的數據流。 在此案例中,最好使用虛刪除來處理這些重複專案,而不是定義會持續嘗試重複數據刪除 所有記錄的具體 化檢視。

解決方案 #5: ingest-by 範圍標籤

'ingest-by:' 範圍卷標 可用來防止擷取期間重複。 這只有在保證每個擷取批次沒有重複項的使用案例中才相關,而且只有在相同的擷取批次多次內嵌時,才會預期重複。

摘要

數據重複可以透過多種方式處理。 請仔細評估選項,並考慮價格和效能,以判斷您企業的正確方法。