通常講的數據倉庫ETL, 可以分為ETL和ELT兩種實現方式. ELT是在加載到倉庫后, 再做數據轉換. ETL 是在加載之前完成轉換, 落地的數據就是轉換后的樣子了.
ELT多使用在MPP架構的數據倉庫平台上, 比如Teradata, greenplum, 主要考慮點是, MPP數據倉庫數據處理能力強, 在加載后再做轉換, 可以充分利用這一優勢. 另外, Extract和Load過程很簡單, 且數據倉庫廠商提供unloading/loading的命令行工具一般具有並行處理能力, 所以直接用這些命令行工具滿足. 至於轉換部分過程, 多為通過sql查詢出stage區新加的記錄, 然后做一些運算, 最后再拼sql將計算后的數據放在另一個區.
如果數據倉庫是建在Oracle/SQL Server這類架構數據庫上, 多采用ETL方式, 將轉換放在數據倉庫外運行, 以減輕數據倉庫的壓力. ETL過程也多選購商業軟件, 比如Datastage, SSIS.
在ELT方案中, python也可大有作為. 即使是使用數據倉庫廠商提供的命令行工具做Extracting和Loading, python仍可以作為膠水. 拼sql, python的三引號字符串以及字符串操作都超強, 很適合.
在ETL方案中, 使用python完成流程控制自然是很輕松的, 所以關鍵點是, 提供一個高效的基於記錄行的pipeline執行機制, 以及如何提供較高的執行效率. 下面有幾個開源項目還不錯, 值得在項目中一試. 其實甚至不用什么額外的開源項目, 用標准庫也很容易做transform的, 因為python內建支持sqlite, 接下來無需多講了.
基於pipeline的開源項目:
(推薦度*****) petl, http://petl.readthedocs.org/en/latest/
http://pypi.python.org/pypi/petl
http://pypi.python.org/pypi/petlx
特點是: 項目活躍度較高; 文檔很不錯; 支持多種數據源; 支持iterator(具有lazy加載機制); 很容易學習.
(推薦度****) pygrametl, http://pygrametl.org/ http://people.cs.aau.dk/~chr/pygrametl/ ,
特點是: 文檔全, 有用戶實例. 我看了寫代碼, 代碼質量很高; 作者實現了基於維度建模思想的幾個轉換組件, 支持cpython/jpython, 很容易學習.
(推薦度***) pyf, http://pyfproject.org
特點是: 具有web 頁面, 功能很眩. 大量使用python generator機制, 其本身也是基於flow based programming. 學習難度較大.
ETL往往也要關注執行效率, 關於python並行處理, 單機上, CPython當然要選擇multiprocessing方式, 一來可充分利用多核, 同時編程難度也不大. 要是將多個任務分配在幾個機器執行, 我認為選用久經考驗的gearman最合適, 不僅能提供負載均衡, 而且可以改善可用性.
