开源ETL项目介绍 之一 Kettle简介 因为项目的需要,需要了解一些开源的ETL工具,选中的ETL工具包括Kettle,CloverETL等。本文和接下来的几篇文章要介绍一下这些工具的使用和其代码结构。 Kettle简介 Kettle : 该项目(http://www.kettle.be/index.htm)翻译成中文名称应该叫水壶,名字的起源正如该项目的主程序员MATT在一个论坛里说的哪样:希望把各种数据放到一个壶里然后以一种指定的格式流出。项目遵守LGPL协议,下面主要包括四部分,分别为Chef,Spoon,Kitchen,Pan听起来名字都比较怪,都是和厨房相关的东西,从照片看MATT和他老婆都有些胖,可能是喜欢厨房吧 。 Kettle可以从其网站下载,使用ANT直接编译,在distrib目录下有可以运行的脚本。下面先介绍Chef和Spoon Chef: 是一个图形用户界面,使用SWT开发,用来设计一个作业。创建的作业可以由Kettle的另一个工具Kitchen来执行。Kitchen是一个作业执行引擎,用来进行转换,校验,FTP上传。 Chef中的作业项主要有转换,SQL,FTP,邮件,检查表存在,检查文件存在,执行SHELL脚本或WINDOWS批处理(注:WINDOWS批处理不能有输出信息到控制台),作业之间可以有箭头连接,箭头方向代表了执行顺序,连接分为三种:无条件,成功后,失败后代表执行条件。用户定义的作业可以保存在XML中或某一个特定的数据库中,KETTLE会在系统的用户目录下(如Windows系统中的C:Documents and SettingsAdministrator)建立一个.KETTLE目录,用来保存用户的这些设置。 Spoon:Spoon 是Kettle的另一个图形用户界面,用来设计数据转换过程。创建的转换可以由Kettle的另一个工具Pan来执行。Pan是一个 数据转换引擎,负责从不同的数据源读写和转换数据。在Spoon中,用户可以使用左面的组件树,在右面的面板中设计转换流程,左面的组件树中包括了Connection, Steps, Hops, Base step types, Plugin step types等节点,其中 Base step types 节点中定义了一些常用的转换步骤,包括过滤、排序、聚集、分组、合并等,用户可以使用这些组件在Graphic view面板中创建一个转换流程。并在Log View面板中查看运行结果。 Base step types中包括: 1. Select values: 用于选择列,重命名列,指定列长度或精度 2. Filter rows: 通过使用一个表达式从输入行中过滤数据,将结果是TURE或FALSE的行输出到不同的节点。表达式是“
”“OPERATOR”“”的形式,其中OPERATOR可以是 =,<>, <, >, <=, >=, REGEXP,IS NULL,IS NOT NULL, IN LIST, CONTAINS, STARTS WITH, ENDS WITH。 用户可以增加多个表达式,并用AND或OR连接。 3. Sort rows:对指定的列以升序或降序排序,当排序的行数超过5000时需要临时表。 4. Add sequence:为数据流增加一个序列,可以使用ORACLE中某一序列的值或由用户指定值 5. Dummy:不做任何处理,一般作为流程的终点。 6. Join Rows (catesian product):对所有输入流做笛卡儿乘积。 7. Aggregate Rows:聚集行数据,提供SUM,AVERAGE,COUNT,MIN,MAX,FIRST,LAST聚集函数,该类型不提倡使用,将来会被GROUP BY 类型替代。 8. Java Script value:使用mozilla的rhino作为脚本语言,并提供了很多函数,用户可以在脚本中使用这些函数。例如 var prev_row; if (prev_row == null) prev_row = row; ... String previousName = prev_row.getString(“Name”, “-”); ... prev_row = row; 可以获得字段Name的前一条记录的值,getString是一个函数。 9. Row Normaliser:该步骤可以从透视表(PIVOT TABLE)中还原数据到事实表,如从表一转换成表二,需要使用该步骤。 10. Unique rows:去掉输入流中的重复行,在使用该节点前要先排序,否则只能删除连续的重复行。 11. Group by:分组 12. Calculator:提供了一组函数对列值进行运算,使用该方式比用户自定义JAVA SCRIPT脚本速度更快。 13. Merge Rows:用于比较两组输入数据,一般用于更新后的数据重新导入到数据仓库中。两组数据中一组是引用流,一组是比较流,每次比较后只有最新版本的行数据被输出到下一步。比较结果包括:一致:两组流的主键一致,值一致有变化:两组流的主键一致,值有一个或多个不同新行:引用流中有而比较流中没有某一主键被删除的行:比较流中有而引用流中没有某一主键 14. Add constants:增加常量值。 15. Row denormaliser:同正规化过程相反。 16. Row flattener:表扁平化处理除了上述基本节点类型外还定义了扩展节点类型,如SPLIT FIELDS,EXECUTE SQL SCRIPT,CUBE INPUT,CUBE OUTPUT等。图一中创建了一个简单的数据流程示例,共包括5个节点,其中Table input节点使用了SQL SERVER数据库中的一张表(三条记录),Filter rows中定义了过滤条件,将符合条件的发送到file2节点,不符和条件的记录发送到Select values节点。 Select values节点中选择列,并对选择的列进行了设置,将结果发送到file1节点。file1,file2节点分别是两个文本文件节点,最终用来保存数据。该流程运行后,可以在Log View面板中查看运行结果,如图四所示 从table input结点输入3条记录,经过滤后输出到file2节点2条记录(OUTPUT列中的3是指2条记录加1行列名),输出到file1节点1条记录(OUTPUT列中的2是指1条记录加1行列名)。 图一 工作流程 图二 运行结果日志 结论: 1 作为一个开源项目,总体感觉还是不错的,当然用户界面没有商业软件美观。 2 从其提供的文挡来看,该ETL支持的数据库范围比较广,跨平台性好。 图三 支持的数据源 3 感觉还不很稳定,如在WINDOWS下测试Chef时,创建了一个JOB,第二次就无法启动Chef了,使用java命令行启动,控制台报错, Exception in thread "main" java.lang.NullPointerException at be.ibridge.kettle.repository.RepositoriesMeta.findRepository(Unknown Source) at be.ibridge.kettle.spoon.Spoon.main(Unknown Source)。当把.KETTLE目录中和Chef相关的文件删除,才可以再次启动。在运行过程中还会出现其他一些异常情况。
TAG:
ETL
Kettle
10秒注册会员 结交数据仓库朋友 分享你的精彩