Data Pipeline Design Patterns(2) Partial Mirroring

Bryan Yang
A multi hyphen life
Jul 6, 2021

部分鏡像 — Select and Filter

適用情境

將原始資料表的「部分欄位(Columns)(一個或是多個)」或是「部分的 紀錄(Rows)(一個或是多個)」同步到其他地方供其他應用取用。我們會用 Select 和 Filter 表達兩種不同的選取部分資料方式。

Select

Select 的命名是對應到 SQL 中的基本操作,這邊僅只選取特定欄位的狀況。例如後端有個存放使用者個人資料的 Table,有時候會有使用者的個人資料,為了避免分析人員碰到機敏資料(例如真實名字或 Email),一種可能的作法就是將敏感資料移除,只將相對不敏感的資料轉移到其他地方。這種情況我們會以欄位名稱為單位的來做選擇。

Filter

Filter 的命名是根據特定條件來篩選資料,對應到 SQL 的指令就是 Where。例如來源的資料表收集了各種不同的使用者事件,但是今天我只需要分析其中兩種事件就好,這時候就會根據特定的條件來做刪選,只將符合條件的紀錄拋到目的地。

Limitation

在這情境下:

  1. 因為是只讀取部分的資料,所以僅需計算選取資料欄位乘以選取資料筆數的大小。
  2. 呈上,儘管如此,但如果原始資料的 Rows 數還是很多的話,,由於 Row-based 的資料庫(例如 MySQL)在做 by Row 的篩選計算量較大(在沒有 index 的情況下)為避免造成原始資料庫的負擔,更新頻次也不會太即時,適用於不需要即時同步的資料。

Prerequisite

基於上述限制,當情境落入技術規格討論時,需要確認

  1. 原始 Table 的筆數和欄位數量
  2. 原始 Table 每天的變化量,以預測這樣的方式能夠是用多久
  3. 每天適合同步的時間(通常會是過了半夜十二點後,或是來源資料庫負擔較輕的時候)
  4. 確認要從原始資料選取的欄位名稱
  5. 確認要從原始資料選取紀錄的邏輯
  6. 確認來源資料庫與目標資料庫使用的技術
  7. 確認雙邊資料的 Schema,根據技術不同,能夠支援的 Data Type 也會不一樣

處理流程

針對這樣的需求,Data Pipeline 流程大致如下

  1. 刪除 TargetTable (需要使用 If exist 避免冷啟動時失敗)
  2. 根據 Select 的結果,建立 Target Table Schema
  3. 讀取 Source Table 的資料並將資料寫入 Target Table(如果原始資料量 > 10000 筆,建議使用 mini-batch 的方式處理)
  4. 根據 Filter 邏輯,比對 Source Table 和 Target Table 的資料筆數

--

--

Bryan Yang
A multi hyphen life

Data Engineer, Data Producer Manager, Data Solution Architect