python实现数据仓库ETL

通常讲的数据仓库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最合适, 不仅能提供负载均衡, 而且可以改善可用性.

原文地址:https://www.cnblogs.com/harrychinese/p/python_and_etl.html