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最合适, 不仅能提供负载均衡, 而且可以改善可用性.