Tomofun 的資料基礎建設及演化 — Part 2
從粗糙到精細:如何追求完美的資料品質
壹/ 石鑿千成璧初光,月明珠影待琢晶。
在 Part 1 中,我們分享了 Tomofun 如何從數據倉儲(Data Warehouse)進化到更靈活的數據湖(Data Lake)。一路走來,我們克服了數據處理的挑戰,為未來的應用奠定穩固的基礎。
而在這篇文章中,我們將聚焦於如何淬煉數據品質,猶如雕琢原石般制定資料品質的標準和應對策略,並通過新工具 — 數據湖倉一體(Data Lakehouse)的應用突破瓶頸,將 Tomofun 的數據基礎建設推向全新的高度。
貳/ 隱約溪流繞山轉,幽幽暗石識難全。
隨著 Data Driven 觀念在 Tomofun 內部的逐步推廣,大家對於資料分析的需求猶如山川之水滔滔不絕。
當資料量變得越來越大,資料問題也像是潺潺溪流中的暗礁,讓分析師在處理和清理資料時付出了更多的心力和時間。這些資料問題大致可分為兩種:
- 錯誤的資訊
當分析報表與終端使用者所認知的事實不符時,通常會要求我們檢查是否有資料問題出現。常見原因可能包括測試資料遺留或資料來源的不一致,而這類資料問題的排查往往是最耗時的。 - 資料表的「潛規則」
對於資料表的使用者而言,神秘的代碼、莫名的空值、特殊的 ID 等,都會迫使他們花費額外的時間來尋找答案並做出相應的處理,以確保分析結果的高品質。
參/ 六法同規循有序,千絲百縷織成全。
為了從根本改善問題,我們根據過去的經驗,為 Tomofun 定義了資料品質的六項原則 — 這些原則如同編織的規則,指引著每一筆資料的流向。
若資料違反這些原則,即會被視為髒資料,需加以處理。
Timeliness(即時性)
資料的匯入應在合理的時間範圍內完成,以確保資料的相關性和最新性。
Ex:就像麵包店營業前就會先把麵包烤好一樣,我們必須在每天上班時間前完成從外部系統提取銷售數據,以確保早上的業務報告能夠反映最新情況(這項原則與 Data Ingestion 的品質更相關,先埋下一個小伏筆)Completeness(完整性)
資料表中必須包含所有必要的資料元素。意即對於必須有值的欄位便不應出現空值(null
)。
Ex:如果用戶資料的國家欄位出現空值,我們便不知道他是哪個國家的用戶,當這種用戶過多時便會「自成一國」,影響到分析結果。Uniqueness(唯一性)
每一筆具有特定細節的資料記錄在資料庫中應僅出現一次,避免重複。
Ex:假設每筆訂單都被更新10次,而我們也錯把每次的更新紀錄當成獨立的訂單,那銷量也會跟著膨風10倍哦。Conformity(協調性)
資料應遵循所需的格式和結構,也需要考慮到易讀性以增降低學習門檻。
Ex:在用戶資料表中,用戶的帳號狀態(account_status
)被以1~5
的方式編號,使用者如果想要參透其意義,就需要花時間尋找文件、查詢文件。Accuracy(準確性)
資料中不應包含測試或虛擬的數據(假資料)。
Ex:我們會檢查並刪除所有的測試用戶數據,確保報表中的數據準確反映真實的用戶行為。Consistency(一致性)
對於具有相同意義的欄位,應統一欄位名稱以保持一致性。
Ex:用戶編號在不同資料表中常常有不一樣的欄位名稱,例如account_id
,user_id
和furbo_account_id
,其實會讓使用者很困擾。
肆/ 工具精良善治本,階梯層進玉始成。
新工具 Databricks 的引入
想要透過資料清理來提升品質,必須先具備彈性且高效的資料集更改能力。
我們在 Tomofun 的資料基礎建設及演化 — Part 1 中曾提到「難以更新在數據湖中的資料」的問題,而 Databricks 的湖倉一體(Lakehouse)架構便能讓我們輕鬆做到這件事。
此外,Databricks 還提出了獎章架構 (Medallion Architecture) 這個概念,將資料表分成不同層級,而資料清理便是使這些資料從 Bronze 層 “升級” 到 Silver 層的一條必經之路。
- Bronze:包含從各種來源直接收集的原始數據。這一層的資料往往包括錯誤和不一致,就像一塊尚未打磨的原石,需要進一步處理。
- Silver:在這一層,我們透過 Tomofun 的資料品質原則對數據進行了清理和標準化處理,確保數據變得光鮮亮麗、無懈可擊。
- Gold:這一層的數據經過聚合 (Aggregation) 和商業邏輯處理,準備好用於分析和 Tableau 的各種報表,綻放出寶石般的光輝。
資料清理策略的實際應用
根據 Tomofun 的資料品質原則所過濾出來的髒資料大致可以分為三類: Repairable 、 Removable 及 Unresolvable。我們針對每一類施以不同的處理方式,以確保數據在清理後能夠朝著正確的方向修正。
以下將用 Databricks Delta Live Table 舉例,說明如何針對不同類別對症下藥並改善資料品質。
Repairable Data (可修復)
神秘的代碼及統一欄位名稱等問題可以通過轉換(Transform)和標準化處理,使資料變得更加易於理解和使用。
-- Use mapping to transform values
CASE
WHEN status = 1 THEN 'ACTIVE'
WHEN status = 2 THEN 'PREREGISTER'
WHEN status = 3 THEN 'INACTIVE'
WHEN status = 4 THEN 'FROZEN'
WHEN status = 5 THEN 'DELETED'
END AS account_status
Removable Data (可移除)
開發及測試資料、重複的舊資料等本不應存在於生產環境中的資料,需直接從資料表中剔除。
-- Pre-create the blacklist table
CREATE TABLE blacklist_account AS
SELECT account_id FROM account WHERE account_email LIKE '%@tomofun.com';
-- Drop test/dev records by the blacklist table
SELECT ... FROM ...
WHERE account_id NOT IN (SELECT account_id FROM blacklist_account);
-- Drop duplicated and keep latest records
SELECT ...
FROM (
SELECT o.*,
row_number() OVER (PARTITION BY order_id ORDER BY updated_time DESC) AS row_num
FROM bi_prod.bronze.order AS o
)
WHERE row_num = 1
Unresolvable Data (無法解決)
真實資料中出現的空值或異常值,通常源自資料來源有問題。對於這類資料,我們會將其隔離起來並記錄佔比,即為資料品質分數。
當資料品質分數過低時,代表無法處理而被隔離的資料已經太多了,需要追查根本原因,並與資料來源負責單位合作解決問題。
-- Drop the abnormal records but calculate that in the DQ score
CONSTRAINT valid_locale EXPECT account_locale IS NOT NULL ON VIOLATION DROP ROW
伍/ 碧海深藏無價寶,攀峰極目見星辰。
本文回顧了我們在資料品質控管上的挑戰,並介紹了我們為應對這些挑戰而制定的原則和策略,最終成功地將資料清理和轉換應用於實際操作中,使資料品質分數從79%提升到99%,分析效率也提升了30%。
資料品質是一個持續改進的目標,未來我們將完備資料品質的監控系統,實時關注資料的變化與品質,確保任何異常能夠被及時發現和處理;同時隨著數據隱私和安全的重要性日益提升,我們也將進一步加強數據安全控管,保護用戶隱私。
我們期待這些未來的進步能夠使 Tomofun 的資料基礎建設更加穩健,成為成功之路上強有力的後盾。