傳送資料至雲端的裝置會維護該資料的本機快取。 視資料大小而定,本機快取可能會將資料儲存數天甚至數月。 您希望保護分析資料庫不受發生故障並重複傳送快取資料而導致資料重複的裝置影響。 重複專案可能會影響查詢所傳回的記錄數目。 當您需要精確的記錄計數時,例如計算事件時,此問題是相關的。 本文概述針對這些類型案例處理重複資料的最佳做法。
數據重複的最佳解決方案是防止重複。 可能的話,請在資料管線中稍早修正問題。 這種方法可以節省與資料管道上的資料移動相關的成本,並避免花費資源來處理擷取到系統中的重複資料。 不過,在無法修改來源系統的情況下,您可以使用各種方法來解決此案例。
瞭解重複數據的影響
監視重複數據的百分比。 一旦發現重複資料的百分比,您就可以分析問題的範圍和業務影響,並選擇合適的解決方案。
用來辨識重複記錄百分比的範例查詢:
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:不要刪除重複的數據
了解您的業務需求和對重複資料的容忍度。 某些數據集可以使用特定百分比的重複數據來管理。 如果重複的資料沒有重大影響,您可以忽略它的存在。 不移除重複資料的優點是,它不會在擷取程式或查詢效能上增加額外的額外負荷。
解決方案二:在查詢期間處理重複的資料列
另一個選項是在查詢期間篩選出數據中的重複數據列。 您可以使用 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()// 彙總函式,使用具體化檢視進行重複資料刪除 (請參閱具體化檢視建立命令中的範例 #4)。
注意
具體化檢視會耗用叢集資源,這些耗用可能不可忽視。 如需詳細資訊,請參閱具體化檢視 效能考慮。
解決方案 4:使用軟刪除移除重複項目
虛刪除 支援刪除個別記錄的功能,因此您可以使用它來刪除重複項。 僅在偶爾刪除時使用此選項,如果您經常需要去除所有傳入記錄中的重複資料,則不應使用此選項。
選擇具體化檢視和虛刪除重複數據刪除
在具體化檢視和虛刪除之間進行選擇以進行重複資料刪除時,請考慮下列因素:
- 管理和協調流程:具體化檢視是完全受控的解決方案。 您定義檢視一次,系統會處理所有傳入記錄的重複資料刪除。 虛刪除需要協調流程和管理。 如果具體化檢視適用於您的使用案例,請選擇此選項。
- 當資料被去重複處理時:使用軟刪除時,您會先將重複的記錄新增至資料表,然後進行刪除。 因此,在匯入和軟刪除程序之間,資料表會包含重複項目。 使用具體化檢視時,檢視中的記錄 一律 會去重,因為系統會在進入檢視 之前 去重。
- 頻率:如果您需要持續去除重複的資料,請使用具現化檢視表。 如果重複項不常出現,而且您可以在匯入期間識別它們,則軟刪除程序通常比實體化檢視執行得更好。 例如,如果您的擷取通常不會有重複項目,但偶爾會包含已知有重複項目的數據流,最佳做法是使用軟性刪除來處理這些重複項目,而不是定義一個不斷嘗試去重 所有 記錄的具體化視圖。
解決方案 5: ingest-by 擴展標籤
您可以使用 'ingest-by:' 範圍標籤 來防止匯入期間出現重複。 此解決方案僅適用於每個擷取批次沒有重複專案的使用案例,且只有在擷取相同的擷取批次多次時才會發生重複專案。
摘要
您可以透過多種方式處理資料重複。 仔細評估選項,考慮價格和性能,以確定最適合您業務的方法。