系統能夠分爲兩種:一種是 聯機交易系統(OLTP),一種是在線分析系統(OLAP)。OLTP用來收集數據,而後把數據同步到OLAP,在OLAP中進行分析數據。
OLAP能夠減小OLTP的負載,提升對數據的利用率。sql
將數據從OLTP同步到OLAP,有兩種方法:全量同步和增量同步。 數據庫
與增量同步相比,全量同步每次都要同步全部的數據,花費的時間大,對系統的負載高。
與全量同步相比,增量同步的難點在與如何識別出增量數據。數據庫設計
在建表的時候,包含以下字段: 函數
數據倉庫通常分爲ODS層和DW層。ODS存儲OLTP中的原始數據,同步的過程主要發生在ODS層。方法以下:spa
只要modified_time爲當天的記錄,就是當天的增量數據。
因此,在同步的時候,只要對modified_time進行判斷便可。設計
可能出現的異常:
好比,有一條記錄A,建立日期是在20170304,可是在20170305 00:20有修改,而後修改時間變成了20170305。
同步任務原本是在20170305 00:00進行同步,可是因爲調度延遲的問題,致使同步任務在20170305 00:30開始執行。
這個時候,就會漏掉記錄A。由於在同步的時候,記錄A的修改時間已經變成了20170305了。 code
一種解決辦法是,將同步的條件修改成:
只要modified_time爲當天的記錄,或者created_time爲當天的記錄,就是當天的增量數據。 cdn
在DW層對ODS層的表進行彙總須要去重。由於同一條記錄可能通過屢次修改,這些修改是發生在不一樣的日期中的。
去重的方法是使用分析函數row_number()over(partition by primary_key order by modified_time desc)
。即,根據主鍵,取modified_time最新的記錄。
同時在這個過程當中,剔除deleted_flag爲true的記錄。 blog
在DW層對ODS層數據去重以後,就獲得了和生產相同的數據。是否真的正確,能夠使用以下的方法驗證: get
DW層的數據量 = 生產上全部的數據量(total) - 今天建立的數據量(created) - 今天以前刪除的數據量(deleted)
以表table_a爲例子
total = select count(*) from table_a created = select count(*) from table_a where created_time = T+1 deleted = select count(*) from table_a where created_time <= T and modified_time < = T and deleted_flag = true result = total - created - deleted
在這個過程當中,不太好理解的是刪除的數據量(deleted)的計算方法。能夠這樣想:若是modified_time爲今天,那麼能夠肯定在今天以前,這條數據是存在的,由於deleted_flag爲true後modified_time就不變了。