ETL还是ELT?

  ETL过程中往往含有大量的业务逻辑,实现这些业务逻辑仅仅依靠可视化的ETL工具是不够的,大多数还需要通过编码来实现。比如将某商场生产库中的购物记录ETL到查询库中的会员积分表中,其业务逻辑为:超市商品及服装每10元积1分,电子产品每20元积1分,金银珠宝每50元积1分,连续5天消费后积分翻倍,每个月有3次消费超过1000元则当月积分翻倍;再比如根据利率的变化计算银行客户的房贷余额、计算电信用户在不同优惠政策下的当月话费等。

    实现上述业务逻辑的硬编码工具可以采用ETL脚本,也可以采用SQL/存储过程。主流的ETL脚本包括:TCL、Perl、Python以及一些ETL工具自带的脚本,这些语言大多擅长逻辑判断和流程控制,可以实现简单的数据整理工作,包括数据类型检查、增补缺失的字段、剔除重复数据、数据的国际化规范化等,但缺乏批量结构化数据的计算语法或函数,如聚合、分组、查询、排序、排名等,因此较难实现常规的业务算法。要实现上面提到的会员积分、房贷余额、当月话费等功能,程序员不得不先实现批量结构化数据计算的底层函数,这个工作量相当大,因此ETL脚本只能在业务逻辑较为简单的个别场景见到。

    由于ETL脚本实现业务逻辑的困难,导致用户经常用SQL/存储过程硬编码,因为SQL内置批量结构化数据的计算函数,支持逻辑判断和流程控制语法,可以实现较复杂的业务逻辑。这时,ETL过程就变成了ELT过程(实际是ELTL),其步骤一般是:
    1、从业务数据库/Txt/日志/Excel等原始数据源中 Extract数据;
    2、将数据简单Load到中间数据库中,直接Load基本不做计算;
    3、在中间数据库中进行Transform,用SQL/存储过程硬编码,这是整个ELT过程的核心;
    4、将计算结果Load进目标数据库,一般是数据仓库或非生产的查询库;
 
    用SQL/存储过程来实现转换的好处是业务逻辑易于实现,但性能差,成本高。
 
性能差
    用SQL/存储过程来实现ELT中的业务逻辑,就必须先将原始数据Load到中间数据库中。这是个简单的数据复制过程,就是向硬盘文件写入数据,但对数据库来说却极其耗时。和向硬盘写文件不同,向数据库插入数据是个复杂的过程,会涉及数据一致性、日志、约束索引、数据块连续性、分区等等因素,因此它的I/O性能极低。即使经过优化,将数据复制到数据库也比直接复制到文件经常会慢1个数量级。

    此外,ELT中涉及的原始数据一般都比较大,比如银行的房贷客户,总数可能涉及数千万人;电信的通话记录,每天都会产生上亿条;再比如大型连锁商场的购物明细,每个月都会产生TB级的数据。可以想象,将原始数据Load进数据库会带来性能的急剧下降,这将严重影响报表和业务分析的可用性。
 
成本高
    要提高SQL/存储过程的性能,用户必须对数据库升级。传统非MPP数据库的升级就是纵向扩容,即通过增加硬件配置来提高性能。但纵向扩容的问题在于数据库很容易到达性能瓶颈,同时性能的提升并不明显。MPP数据库支持并行计算和横向扩展,可以实现高效的ELT过程,但成本极高。迄今为止,所有产品级的MPP数据库都是专有的,价格昂贵,使用MPP数据库,项目的初期成本以及将来的升级成本都将是个沉重的负担。

    另外,ELT要求用数据库暂存原始数据,这就需要购买额外的数据库存储设备和相应的授权,很多情况下这会导致成本的升高。
ETL脚本缺乏批量结构化数据计算的语法和函数,而SQL/存储过程的性能差、成本高,这使ETL中业务逻辑的计算困难重重,用户不得不在繁重的工作量和低性能高成本中进行无奈的选择。因此,ELT最常遭到诟病的就是遥遥无期的开发周期、迟缓失效的分析结论、远超预算的建设成本。
 
    如何实现带有业务逻辑的ETL过程,如何在成本可控的情况下降低开发难度并获得高性能,使用集算器是可选的方案之一。

    集算器是针对结构化数据计算的程序设计语言,它提供了丰富的内置对象和库函数,可以实现复杂的业务逻辑,同时还能降低从业务逻辑到程序代码的转换门槛。其中,有序集合可以解决SQL/存储过程中的典型难题,比如相对位置访问、多级分组中的行间计算、复杂的排名计算。在Extract和Load阶段,集算器支持异构数据源,也支持数据源混合计算,如关系型数据库和NoSQL数据库以及半结构化数据、本地和局域网的文件数据、HDFS中的文件。


    集算器内置批量结构化数据计算函数,可以轻松实现业务逻辑的计算,可以弥补ETL脚本的不足。集算器可以直接读取源数据进行计算,也可将源数据复制或导出到多个节点机和HDFS分布式文件系统再计算,而不必事先Load到数据库,这就避免了低效的数据库IO操作,性能因而大大提高。集算器还支持可横向扩展的并行计算框架,从而支持大数据计算,在保证高性能的同时可以有效较低成本;集算器使用文件系统和廉价硬盘来暂存数据,很多情况下无需暂存,不必购买额外的数据库存储设备和相应的授权。
 
    下面用“断档高风险商品”的代码片段来说明集算器的大体用法。

    某连锁商场有49家门店,各店都有自己的数据库,在当晚关店后,要进行数据汇总并完成多项业务计算。其中一个目标是计算出集团范围内断档风险高于80%的商品,断档风险的算法是:1-(某商品现有库存/上个月总销量),数字越大风险越大,1则表示完全断档。

    1. 汇总机向节点机分配任务,每台节点机每次汇总一个门店的当日商品销量。节点机计算完毕后将结果返回汇总机,汇总机合并各节点的计算结果并进行全集团的汇总,即集团当日的商品销量。


   2.在节点机上计算单个门店的商品销量。

需要注意的是,代码中是先把数据存入文件再计算,但这并不是必须的步骤,仅仅是为了计算其他目标时节省并发读数据库的时间。另外这里用了分批读取,分批写入,大数据分组等技巧。


3、汇总机上将原库存、上个月的销量、当日的销量关联起来。


4.在汇总机上:计算出当天实际库存、断档风险系数,并将实际库存回写库存表,将断档风险较大的商品回写风险表。



http://hi.baidu.com/datanalysis/item/ccb6a834b36478fe382ffa75

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值