高效儲存的秘訣:bitmap 資料結構在標籤中的應用

袋鼠云数栈發表於2024-07-03

在當今大資料和資訊爆炸的時代,如何有效地管理和查詢海量的資料成為了企業和開發者面臨的重大挑戰。其中,標籤系統作為資料管理中的一種重要手段,被廣泛應用於使用者畫像、商品分類、內容推薦等多個場景。然而,隨著標籤數量的急劇增加,傳統的資料儲存和查詢方式已難以滿足高效率、低延遲的需求。在這種背景下,Bitmap 資料結構作為一種高效的位級資料處理技術,開始在標籤系統中展現出其獨特的優勢。

透過本文將會分享 Bitmap 方案在標籤中的應用實踐。

標籤和群組

標籤

標籤用於描述一組具有相同特徵的實體物件(例如實體可以是使用者,物件就是具體的某一個人)。它能直接關聯到具體的資料項、文件、產品、使用者行為等,以實現快速檢索、過濾和分類的目的。標籤常被用於使用者畫像構建、行為分析以及個性化推薦,透過分析使用者與標籤的互動,系統能更精準地理解使用者需求。

標籤系統的核心在於透過簡單直接的關鍵詞關聯,提高資訊的可發現性和管理效率,適應數字化時代資訊海量增長的需求。

群組

群組提供了一種結構化的方式來整理和操作具有共同屬性的標籤集合,將具有相似特徵、類別或關係的標籤集合在一起,這種結構允許使用者更高效地管理和操作相關聯的標籤集合,而不是單獨處理每一個標籤。

基於大寬表儲存標籤

標籤儲存在大寬表中,每增加一個新的欄位就會在大寬表中新增一個欄位,此時基於標籤的圈群計算會基於這張大寬表進行計算。

file

使用這種結構會重複儲存大量的標籤值,造成儲存資源的浪費,例如上述表格中的 tag_v1 值在多個行中都有進行儲存。在進行標籤的圈群場景時效率不高,例如要統計具有 tag_n1 標籤、標籤值為 tag_v2 且具有 tag_n2 標籤、標籤值為 tag_v3 的實體 ID,此時 SQL 的執行效率較低。

基於 bitmap 資料結構儲存標籤

bitmap 即為一個 bit 陣列,一個 bit 的取值有兩種:0 或 1。將一個資料狀態較少的變數,轉換為一個狀態位 bit(只有0和1兩種狀態),儲存到一個順序的 bit 陣列中,從而在海量資料中快速定位所需資料狀態的資料。這種做法不僅節省記憶體空間,而且能夠快速定位資料位置,在海量資料的排序、查詢、去重相關處理中有極高的效率。

file

bitmap 特性

● 最佳化查詢效能

由於資料以位的形式緊密排列,查詢某個元素是否存在可以透過位運算直接完成,時間複雜度接近O(1),非常高效。使用 bitmap 可以在進行基數統計、唯一值計數等操作時顯著提升效率,特別是在資料有大量重複且需要快速響應的場景下。例如,對於網站訪問日誌分析,bitmap 可以快速判斷不同頁面的獨立訪問者數量。

● 空間效率較高

bitmap 利用每個位元位表示一個元素的狀態(通常是存在或不存在),相比傳統陣列或列表,可以極大節省儲存空間。例如,一個能儲存 32 個整數的陣列,在 Bitmap 中只需一個位元組即可表示 32 個元素的狀態。

● 易於進行集合運算

bitmap 支援快速進行集合的交、並、差等運算,這對於處理資料間的關聯查詢非常有用。

● 適用於統計

bitmap 能夠快速進行計數操作,如統計集合中元素的數量,或統計滿足特定條件的元素數量,常用於大資料分析和資料庫索引中。

● 適應連續性和稀疏性

bitmap 最適合用於表示大量連續整數或稀疏資料集中的元素存在性,對於非連續或隨機分佈的資料,其優勢可能不那麼明顯。

在標籤中如何使用 bitmap 資料型別

對於標籤來講,一個實體 ID 和一個標籤(標籤名+標籤值)的關係可以有兩種——有這個標籤和無這個標籤。那麼我們在設計標籤結果表的時候就可以使用如下的表結構:

file

對比可以看到,使用 bitmap 資料結構在標籤數量較小的情況下可以節省更多的儲存資源。

entity_id_bitmap 資料結構為 bitmap,但是在大多數情況下實體 ID 的資料型別並不是數值型別的,可能為字元型別,由於 bitmap 只能直接支援整數型別,這就會導致無法將實體 ID 存入 bitmap 中,並且即使使用數值型別儲存實體 ID,若不是自增型別的數值,可能會由於資料離散值太大,導致 bitmap 過長從而佔用儲存變大,所以需要將實體 ID 轉化為自增的數值型別。

如何轉化實體 ID 為自增數值型別

使用一張中間對映表來維護自增 ID 和實體 ID 的關係,表結構示意如下:

file

auto_inc_id 欄位使用自增列,entity_id 作為原始的實體主鍵,在每天標籤任務開始執行前判斷一下對映表中是否有實體主表中不存在的實體 ID,若存在則插入對映關係到對映表中。

file

標籤圈群涉及的計算邏輯

結合上述圖示,如若需要計算擁有 tag_n1 標籤、標籤值為 tag_v1 且擁有 tag_n2 標籤、標籤值為 tag_v3 的實體 ID,轉化為 bitmap 型別的處理,其實就是獲取第一行 entity_id_bitmap 和 第三行 entity_id_bitmap 列的交集。

StarRocks 中提供了 bitmap_and 函式來計算兩個 bitmap 的交集,底層計算邏輯大致如下:

file

計算得到自增 ID 為 2 的實體是符合要求的,對應的使用者就是 user_02,此時就完成了簡單標籤圈群的場景計算,由於使用 bitmap 資料結構,底層計算使用位運算方式,計算效率相比使用大寬表的方式有了顯著提升。

StarRocks bitmap 在標籤平臺的實踐

bitmap 在 StarRocks 中的典型應用場景包括但不限於使用者行為分析、日誌資料分析、實時報表生成等,特別是在需要快速進行去重計數和集合運算的場景。

袋鼠雲客戶資料洞察」平臺同時支援 TrinoStarRocks 計算引擎。在使用 StarRocks 引擎時,使用 bitmap 資料結構最佳化標籤儲存和標籤圈群邏輯,相較於大寬表儲存標籤的方式,不僅節省了儲存空間,而且在標籤圈群方面大幅提升了圈群速度。

StarRocks 中自增列的使用方法:

file

StarRocks 提供了豐富的 bitmap 函式來支援集合操作,如交集、並集、差集等,相比 HyperLogLog(HLL),bitmap 可以提供更精確的計數結果,不過代價是更高的記憶體和磁碟資源消耗。

file

標籤系統結果大寬表結構轉為高表,群組結果表儲存為 bitmap 型別的高表,圈群效果有所提升。

file

標籤結果表結構對比如下:

• 大寬表表結構

file

• 使用 bitmap 的高表表結構

file

使用 bitmap 的高表結構能有效減少空值列,減少寬表任務更新時長。
《行業指標體系白皮書》下載地址:https://www.dtstack.com/resources/1057?src=szsm

《數棧產品白皮書》下載地址:https://www.dtstack.com/resources/1004?src=szsm

《資料治理行業實踐白皮書》下載地址:https://www.dtstack.com/resources/1001?src=szsm

想了解或諮詢更多有關大資料產品、行業解決方案、客戶案例的朋友,瀏覽袋鼠雲官網:https://www.dtstack.com/?src=szbky

相關文章