Data Pipeline Design Patterns(2) Partial Mirroring
Published in
Jul 6, 2021
部分鏡像 — Select and Filter
適用情境
將原始資料表的「部分欄位(Columns)(一個或是多個)」或是「部分的 紀錄(Rows)(一個或是多個)」同步到其他地方供其他應用取用。我們會用 Select 和 Filter 表達兩種不同的選取部分資料方式。
Select
Select 的命名是對應到 SQL 中的基本操作,這邊僅只選取特定欄位的狀況。例如後端有個存放使用者個人資料的 Table,有時候會有使用者的個人資料,為了避免分析人員碰到機敏資料(例如真實名字或 Email),一種可能的作法就是將敏感資料移除,只將相對不敏感的資料轉移到其他地方。這種情況我們會以欄位名稱為單位的來做選擇。
Filter
Filter 的命名是根據特定條件來篩選資料,對應到 SQL 的指令就是 Where。例如來源的資料表收集了各種不同的使用者事件,但是今天我只需要分析其中兩種事件就好,這時候就會根據特定的條件來做刪選,只將符合條件的紀錄拋到目的地。
Limitation
在這情境下:
- 因為是只讀取部分的資料,所以僅需計算選取資料欄位乘以選取資料筆數的大小。
- 呈上,儘管如此,但如果原始資料的 Rows 數還是很多的話,,由於 Row-based 的資料庫(例如 MySQL)在做 by Row 的篩選計算量較大(在沒有 index 的情況下)為避免造成原始資料庫的負擔,更新頻次也不會太即時,適用於不需要即時同步的資料。
Prerequisite
基於上述限制,當情境落入技術規格討論時,需要確認
- 原始 Table 的筆數和欄位數量
- 原始 Table 每天的變化量,以預測這樣的方式能夠是用多久
- 每天適合同步的時間(通常會是過了半夜十二點後,或是來源資料庫負擔較輕的時候)
- 確認要從原始資料選取的欄位名稱
- 確認要從原始資料選取紀錄的邏輯
- 確認來源資料庫與目標資料庫使用的技術
- 確認雙邊資料的 Schema,根據技術不同,能夠支援的 Data Type 也會不一樣
處理流程
針對這樣的需求,Data Pipeline 流程大致如下
- 刪除 TargetTable (需要使用 If exist 避免冷啟動時失敗)
- 根據 Select 的結果,建立 Target Table Schema
- 讀取 Source Table 的資料並將資料寫入 Target Table(如果原始資料量 > 10000 筆,建議使用 mini-batch 的方式處理)
- 根據 Filter 邏輯,比對 Source Table 和 Target Table 的資料筆數