今天给大家带来一款ETL工具kettle spoon的实践分享
Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,数据抽取高效稳定。
Kettle这个ETL工具集,它允许你管理来自不同数据库的数据,通过提供一个图形化的用户环境来描述你想做什么,而不是你想怎么做。
Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。
作为Pentaho的一个重要组成部分,现在在国内项目应用上逐渐增多。
这次我就通过工作中使用到的情况来给大家做一个分享也算是我自己的总结。
Kettle spoon 工具实战分享
因为我工作的性质,其防火墙和对数据的来源比较敏感,大致上的流程是从外网的数据库中通过防火墙抽取到边界审计的数据库中,再同步到开发库使用开发后正式库上线。
那么抽取和同步的过程中使用的工具kettle spoon则是今天主要的分享内容,也是通过工作实践的过程分享。
那么spoon工具是什么?具体是用来做什么的?
前面我已经说了在抽取和同步中使用的工具。
首先我们要说一下ETL(数据仓库技术)。ETL(Extract-Transform-Load)是用来描述将数据从来源段经过抽取(extract)、交互转换(transform)、加载(load)至目的端的过程。ETL常用在数据仓库,但其对象不限于数据仓库。ETL是构建数据仓库的重要一环,用户从数据源抽取所需的数据,经过数据清洗,最终按照预先定义好的数据仓库模型,将数据加载到数据仓库中去。
那么spoon则是一款强大的ETL工具。
关于ETL的具体内容,转换过程不是我这次主要的分享内容,有兴趣或工作有需求的小伙伴可以自行去网上查一查。在这里我就简单说一下ETL的架构。
ETL的架构:
在ETL架构中,数据的流向是从源数据流到ETL工具,ETL工具是一个单独的数据处理引擎,一般会在单独的硬件服务器上,实现所有数据转化的工作,然后将数据加载到目标数据仓库中,如果要增加整个ETL过程的效率,则只能增强ETL工具服务器的配置,优化系统处理流程(一般可调的东西非常少)。IBM的datastage和Informatica的powercenter原来都是采用的这种架构。
ETL架构的优势:
1. ETL可以分担数据库系统的负载(采用单独的硬件服务器)
2. ETL相对于EL-T架构(感兴趣的小伙伴百度一下)可以实现更为复杂的数据转化逻辑
3. ETL采用单独的硬件服务器。.
4. ETL与底层的数据库数据存储无关。
那么在简单了解ETL的内容后就开始我们这次的实践分享。
*** spoon这款工具十分强大,但是我目前编写的脚本相对于比较简单,如果有兴趣或工作中可以用到的小伙伴可以之后自行学习,也欢迎讨论。
1. 脚本的思路:我是需要两张表的数据同步更新,所以需要进行两张表的数据对比,如果审计数据表中与源数据表的数据量不一致,则需要同步更新一次,那么判断数据不一致的方法则是:在表输入模块中编写sql语句,再进行合并记录判断并映射,如果不一致则进行更新。把需要同步更新的表格一一进行编写并保存
表同步脚本编写后需要创建新的作业,用来执行你所写的脚本,以便他实时更新。在作业执行过程中最好不要一次进行多张表的更新,否则会非常占用内存,所以在这里需要写一个case,每次进行随机的执行一张同步表的脚本。执行作业就可以实时同步数据表啦!
在这里编写脚本的大概框架就呈现出来了,那么在脚本运行的过程中,因为我这两个数据库分别是MySQL和Oracle ,所以会出现数据类型不一致的问题,因此在脚本中又添加了字段选择的模块进行字段的处理。
下面就进行我使用的模块一一介绍吧
2. 在这个过程中我用到的主要模块是表输入,字段选择,值映射,合并记录,插入/更新,Switch/Case。
1. 首先要在表输入模块中新建你需要连接的数据库,可以根据不同的连接类型进行选择,总之连接类型还是很多的;在此模块中还能进行sql语句的编写如下图。
那这两个表输入模块中写的sql语句只是想判断一下两张表的数据是否一致。
2.那么在字段选择模块中 就是选择我所写的sql语句中判断的两个标志
在合并记录的模块中则是设置表输入的新数据与旧数据选择,因为同步外网的数据,所以旧数据是我边界审计的数据库,新数据就是连接外网的数据库。那么两张表会依据你设置的匹配关键字和数据字段进行比较是否一致。
3.在值映射模块中可以选择你要映射的原值和目标值进行替换如下图:
4.这时候再使用一个字段选择模块,选择上面的关键字
5.那么在最后的表输入中就可以选择你要写入的表 也就是旧数据的表,配上sql语句,如下图
6.最后使用插入/更新模块将整个表的内容全部插入
那么关于这张表的更新脚本就完成啦
8.工作中是多张表的更新,所以就有了刚才的那个脚本。
这里连接的当然是我要更新的数据库了,写了一个随机生成数的语句,每执行一次则随机更新一张表格。
9.那么刚才创建的是转换脚本,为了实时更新,我们则需要创建一个作业。
10.那么在执行的模块中 设置刚才建好的脚本
11.start和成功无需设置运行这个作业 就可以实时更新啦
那这次内容就到这里。
我工作的地方现在用这个工具爬取网站上的天气预报并传到我们数据库中,实现实时更新,然后交给开发那边将网站上加入天气预报的功能。。。简直就是盗用别人的东西嘛,但是使用这个工具就是很简单的操作就可以完成这个任务。
工作中如果需要用到这方面的同学可以试一试,真的是一款很强大的工具。欢迎大家一起讨论!