KaiwuDB 時序引擎資料去重功能詳解

KaiwuDB發表於2023-12-25

一、背景介紹

隨著物聯網領域的快速發展,時序資料的產生和處理需求不斷增長。時序資料是按照時間順序收集和記錄的資料,其特點在於資料具有時間戳,並且時間是資料分析和查詢的一個重要維度。

在實際場景中,可能存在多條相同時間戳的資料寫入資料庫中。資料去重功能可以更好地糾正資料的準確性,同時能夠節省儲存空間,降低儲存成本。

本次直播介紹了  KaiwuDB 資料去重功能開發背景 整行去重功能 部分列去重功能 的實現方式及使用場景。

1. 資料去重意義

資料去重是指在資料集中刪除重複的資料記錄,保留資料記錄的過程。

去重功能的意義主要有以下方面:

  • 降低資料處理的時間和成本;

  • 提高儲存空間的利用率;

  • 提高資料分析的準確性;

  • 增強資料的質量和可靠性。

2. 資料去重背景

(1)資料整行去重

資料整行去重是指時序表可以支援時間戳下多條資料的寫入去重,後寫入的資料會覆蓋前條資料。

資料整行去重功能開啟後,第一次成功插入的資料能夠被成功查詢到,且若後續再次出現相同時間戳資料,該資料亦可被更新。相同時間戳的資料寫入成功後,某一時間戳下僅存在一條最新資料。

(2)資料部分列去重

資料部分列去重是指時序表支援相同時間戳的不同列分批插入表,會更新整合成一條資料。

寫入一條資料後,當前寫入重複資料亦可被更新(整條或單列)。資料寫入成功後,某一時間戳下僅存在 1 條最新資料,空的列會與其他重複資料合併。

二、KaiwuDB 去重功能

1. 概念說明

  • 順序資料 正在寫入的記錄時間戳比表中所有記錄最大的時間戳還要大。

  • 亂序資料 不滿足順序資料定義的正在寫入的記錄,都歸屬於亂序資料。

  • 重複資料 重複資料一定是亂序資料,因為表中已經儲存這個時間戳的記錄,屬於亂序資料中的一種特殊資料。

  • 時序資料 按照時間順序收集和記錄的資料,其特點在於資料具有時間戳,並且時間是資料分析和查詢的一個重要維度。

如圖中所示,寫入以儲存的最新資料的時間戳作為分割線,往後的資料都是順序資料範圍,而分割線之後的資料都是亂序資料。

2. 去重的前提-亂序資料處理

亂序資料處理功能是指支援對時序表寫入的資料亂序場景進行處理。比如在特定時間視窗內( 10 分鐘或 1 小時)內的亂序資料會儲存下來,時間視窗外的按照特定的規則處理(過濾掉資料,寫入一條告警日誌)。

亂序資料處理功能是為了能按照資料時間戳分割槽,使得資料庫儘可能禁止向壓縮分割槽寫資料。

亂序資料的處理是基於亂序時間視窗來做的,亂序時間視窗指表最新資料時間戳的時間點一直到往前的一段時間的時間範圍,每個表的時間視窗都不一樣,如果表沒有新資料的寫入,則它的時間視窗不會變。

如圖中所示,超過時間視窗的亂序資料是不能夠寫入成功的。順序資料寫入能夠正常寫入成功,但是如果是往已壓縮分割槽寫資料,能夠寫入成功,會在 log 中列印一條亂序資料。

3. 資料去重功能

重複資料是亂序資料中特殊資料型別,資料去重功能是對亂序資料處理機制的補充和完善。資料去重處理的資料範圍是亂序時間視窗內的重複資料,亂序時間視窗外的重複資料會被丟棄掉。

資料去重處理也會保留之前亂序資料處理中對重複資料的處理策略,並在此基礎上,擴充套件出更新、拒絕、忽略等去重策略。

(1)重複資料查詢演算法

資料去重功能也是基於亂序時間視窗機制實現的。基於此機制,KaiwuDB 實現了重複資料查詢演算法:

  • 從資料時間線上來說,只要查詢時間範圍為【正在插入的資料時間戳 - 亂序時間視窗,正在寫入的資料時間戳】內的記錄,並判斷是否時間戳相同,就能過濾出正在插入的重複記錄。

  • 從最新資料的時間戳往時間戳小的方向遍歷,(正在插入的資料時間戳 - 亂序時間視窗)這個時間戳的記錄不一定存在,因此,需要遍歷找到比(正在插入的資料時間戳 - 亂序時間視窗)小的時間戳即可。 演算法 1

  • 但由於插入的資料是亂序的,可能存在如下圖亂序時間視窗 2 內的亂序,大於(正在插入的資料時間戳 - 亂序時間視窗)記錄會儲存在(正在插入的資料時間戳 - 亂序時間視窗)時間戳的前面,演算法 1 就不能遍歷到。

此種情況最壞結果是兩個亂序時間視窗串聯,即亂序時間視窗2的結束時間與亂序時間視窗的開始時間相同,此時,需要遍歷找到比(正在插入的資料時間戳 - 2 * 亂序時間視窗)小的時間戳。

透過重複資料查詢演算法,得到相同時間戳的記錄為重複記錄,放入重複記錄陣列中。

(2)整行去重

透過重複資料查詢演算法查詢到相關重複資料後,如果是整行去重,在寫入時,會將最新的資料寫入資料庫中,寫入成功後,將查到的重複資料做刪除標記,後續會刪除。

寫入流程如圖所示:

(3)部分列去重

部分列去重策略,會補齊正在插入記錄中數值為空的列。當正常插入記錄的第 X 列為空時,我們遍歷重複記錄陣列,找到第 X 列不為空的數值,當有多個數值時,取最近插入的記錄中的第 X 列的數值。

如下圖,重複記錄 1 插入早於重複記錄 2,當正在插入的記錄如下圖時,部分列去重規則產生的新記錄每列取值為標綠的數值。

三、KaiwuDB 去重功能應用場景

1. 預設去重策略

  • 場景說明 :沒有配置去重策略,啟動 KaiwuDB 並插入三條時間戳相同的記錄。

  • 使用者行為 :沒有在配置檔案中設定去重引數

  • 系統行為 KaiwuDB 啟動預設的去重策略:不去重,三條記錄都可以寫入成功,並且都能被查詢到。

2. 配置去重策略為 reject

  • 場景說明:配置去重策略,啟動 KaiwuDB,連續三次執行 insert 語句插入時間戳相同的記錄。

  • 使用者行為 引數配置為 reject - 禁止插入重複資料。

  • 系統行為 第一條記錄插入成功,後面兩條記錄插入時報錯只有第一條記錄儲存,並且可以被查詢到。

3. 配置去重策略為 override

  • 場景說明 配置去重策略,啟動 KaiwuDB,一條 insert 語句中同時插入三條時間戳相同的記錄。

  • 使用者行為 引數配置為 override - 只保留最新整行記錄。

  • 系統行為 Insert 語句執行成功,查詢時,只有第三條記錄能夠被查詢到。

4. 配置去重策略為 merge

  • 場景說明 配置去重策略,啟動 KaiwuDB,插入三條時間戳相同的記錄。

  • 使用者行為 引數配置為 merge - 歷史資料合併。

  • 系統行為 :三條 insert 語句執行成功,查詢時,只返回一條合併記錄。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70027415/viewspace-3001438/,如需轉載,請註明出處,否則將追究法律責任。

相關文章