生理学笔记 - ecsponline.com医学笔记系列丛书 生理学笔记 (修订版) 主 编 魏保生 北京大学医学和Syracuse大学(美国)信息管理双硕士 编
Kettle笔记 4 简单的案例
-
Upload
zhangmengzhi -
Category
Documents
-
view
272 -
download
11
Transcript of Kettle笔记 4 简单的案例
Kettle 笔记 4 简单的案例作者:张孟志日期:2014-03-18
联系方式:[email protected]
Kettle 笔记 4 简单的案例
简单概括一下数据转换的几种具体应用场景,按网络环境划分主要包括:表视图模式:这种情况我们经常遇到,就是在同一网络环境下,我们对各
种数据源的表数据进行抽取、过滤、清洗等,例如历史数据同步、异构系统数
据交互、数据对称发布或备份等都归属于这个模式;传统的实现方式一般都要
进 行 研 发 ( 一 小 部 分 例 如 两 个 相 同 表 结 构 的 表 之 间 的 数 据 同 步 , 如 果
sqlserver 数据库可以通过发布/订阅实现),涉及到一些复杂的一些业务逻辑
如果我们研发出来还容易出各种 bug;前置机模式:这是一种典型的数据交换应用场景,数据交换的双方 A 和 B
1
网络不通,但是 A 和 B 都可以和前置机 C 连接,一般的情况是双方约定好前置
机的数据结构,这个结构跟 A 和 B 的数据结构基本上是不一致的,这样我们就
需要把应用上的数据按照数据标准推送到前置机上,这个研发工作量还是比较
大的;文件模式: 数据交互的双方 A 和 B 是完全的物理隔离,这样就只能通过以
文件的方式来进行数据交互了,例如 XML 格式,在应用 A 中我们开发一个接口
用来生成标准格式的 XML,然后用优盘或者别的介质在某一时间把 XML 数据
拷贝之后,然后接入到应用 B 上,应用 B 上在按照标准接口解析相应的文件把
数据接收过来;综上 3 种模式如果我们都用传统的模式无疑工作量是巨大的,那么怎么做
才能更高效更节省时间又不容易出错呢?答案是我们可以用一下 Kettle!
在本文中将演示两个案例,一个是读取 CSV 文件数据后转换为 XML 文件
保 存 —— CSV2XML , 一 个 是 数 据 库 inputdb 中 的 user 表 同 步 到 数 据 库
outputdb 的 user 表——DB2DB。
2
CSV2XML
1.准备一个 CSV 文件——CSV2XML.CSV,里面是需要读取的数据。last_name, name
Suarez,Maria
Guimaraes,Joao
Rush,Jennifer
Ortiz,Camila
Rodriguez,Carmen
da Silva,Zoe
2.新建一个转换,保存(到资源库)。
3.分别将 CSV 文件输入(输入)、Java Script 代码(脚本)和 XML 输出(输出)组件
拖到主工作台上,按住 Shift 键,同时,点击一个组件,形成被选中的状态,拖
动到目标组件上。于是,形成一个数据流向的箭头(hop)。显示效果如下图所示,
下面将展示组件配置。
3
4. 根据 CSV2XML.CSV,依次配置 CSV 文件输入、Java Script 代码和 XML 输出
组件。配置 CSV 文件输入,配置内容简明易懂,不一一详述。点击“获取字段”
可以从配置的文件(文件名)中获取到 CSV 文件第一行数据,并作为字段。注
意这个字段名必须为英文字符并且不能有空格。“预览”可以查看配置的结果,
这就知道配置是否有错误。
配置 Java Script 代码。“CSV 文件输入”的字段在这里是输入参数,可以直
4
接作为变量使用。最下方的字段表格框可以定义这个步骤输出的参数,最终输
出参数将包括“CSV 文件输入”的字段和这里定义的字段。“测试脚本”可以
查看配置的结果,这就知道配置是否有错误。
配置 XML 输出。
5
5.保存转换后运行。按 F9,或选择“运行”-->“执行转换”,在执行转换界面“启动”转换。
6.查看日志与结果。执行转换过程会有信息输出到控制台。重点查看“步骤度量”、“日志”。
6
查看输出的 XML 文件——CSV2XML.xml。<?xml version="1.0" encoding="GBK"?>
<Rows>
<Item><LASTNAME>Suarez</LASTNAME> <NAME>Maria</NAME> <MSG>Suarez.Maria posted a blog at
2014-02-01 15:54:53</MSG> </Item>
<Item><LASTNAME>Guimaraes</LASTNAME> <NAME>Joao</NAME> <MSG>Guimaraes.Joao posted a blog
at 2014-02-01 15:54:53</MSG> </Item>
<Item><LASTNAME>Rush</LASTNAME> <NAME>Jennifer</NAME> <MSG>Rush.Jennifer posted a blog at
2014-02-01 15:54:53</MSG> </Item>
<Item><LASTNAME>Ortiz</LASTNAME> <NAME>Camila</NAME> <MSG>Ortiz.Camila posted a blog at
2014-02-01 15:54:53</MSG> </Item>
<Item><LASTNAME>Rodriguez</LASTNAME> <NAME>Carmen</NAME> <MSG>Rodriguez.Carmen posted a
blog at 2014-02-01 15:54:53</MSG> </Item>
<Item><LASTNAME>da Silva</LASTNAME> <NAME>Zoe</NAME> <MSG>da Silva.Zoe posted a blog at
2014-02-01 15:54:53</MSG> </Item>
</Rows>
XML 文件确实按照我们的定义生成了,但好像有字符集表示错误。为什么
会这样呢?启动自己编译的 Kettle4.4再运行一下这个转换试试。Kettle4.4 是没
有字符集表示错误的,这又说明旧有系统升级可能带来问题,建议使用旧的稳
7
定版本。从下面开始我们将使用自己编译的 Kettle4.4。
DB2DB
一个没有数据库的复杂系统是很难想象的。而数据库多种多样,也是千差
万别。因此对旧有系统产生的数据做 ETL 的重要工作之一就是操纵各种数据库。
由于设备限制,在这里只演示 MySQL 数据库抽取数据到 MySQL 数据库,对于
Kettle 用户而言,不同的数据库只是在资源库中连接配置不同罢了。DB2DB 的目标是将数据库 inputdb 中的 user 表同步到数据库 outputdb
的 user 表。1.创建数据库/表。
//命令行 root 用户登录@>mysql -u root -p@>密码//创建 input 用户CREATE USER input IDENTIFIED BY 'input';//创建 inputdb 数据库CREATE database inputdb;//赋权 inputgrant all privileges on inputdb.* to input identified by 'input';//刷新系统权限表flush privileges;
//创建 output 用户CREATE USER output IDENTIFIED BY 'output';//创建 outputdb 数据库CREATE database outputdb;//赋权 output
8
grant all privileges on outputdb.* to output identified by 'output';//刷新系统权限表flush privileges;
exit;
input 用户创建表并插入初始数据。//命令行 input 用户登录@>mysql -u input -p@>密码//使用 inputdb 数据库use inputdb;//创建 user 表create table user (id int not null,userid varchar(30) not null,username varchar(200) not null) default charset=utf8;//插入数据,这句很重要(查询也需要),不然会乱码set names gb2312;insert into user values(1,'lisi','李四');
9
insert into user values(2,'zhangsan','张三');insert into user values(3,'wangwu','王五');exit;
output 用户创建表。//命令行 output 用户登录@>mysql -u output -p@>密码//使用 outputdb 数据库use outputdb;//创建 user 表create table user (id int not null,user_id varchar(30) not null,user_name varchar(200) not null) default charset=utf8;exit;
读者请注意,input 和 output 的 user 表字段名并不相同。2.配置资源库的连接。将 MySQL 的 JDBC 连接 jar 包放入依赖包扩展目录下,例如(F:\kettle4.4\
distrib\libext\JDBC)。启动 Kettle4.4 的 Spoon,可以看到为 Kettle5配置的资源库 mysql4kettle。为
什么?因为现在这个值已经是 Kettle设置的系统参数了。
10
输入 admin密码直接进入 Spoon。Kettle4.4汉化得并不完整,很多地方还是
英文。我们进入探索资源库的 Connections Tab页。新增两个数据库连接,分别
对应 inputdb/outputdb。
11
3. 新建一个转换,保存(到资源库)。4.分别将表输入(输入)和插入/ 更新(输出)组件拖到主工作台上,按住
Shift 键,同时,点击一个组件,形成被选中的状态,拖动到目标组件上。于是,
形成一个数据流向的箭头(hop)。显示效果如下图所示。
5.配置表输入和插入/ 更新组件。表输入组件配置,数据库连接下拉列表框中选择 inputdb,也可以在旁边编
12
辑这个数据库连接或新建。在 SQL语句文本框中数据从 inputdb 抽取数据的 SQL
语句。“预览”可以看到这个配置的数据输入结果。
插入/ 更新组件配置,数据库连接下拉列表框中选择 outputdb,,也可以
在旁边编辑这个数据库连接或新建。目标表为 outputdb 中需要插入/更新记录的
表。用来查询的关键字,这个表格框用来填写更新的关联字段,通常是主键。
更新字段,填写的是 outputdb 中 user 表需要插入/更新记录的字段,注意与输
入数据的字段匹配。
13
6. 保存转换后运行。按 F9,或选择“Action”-->“执行”,在执行转换界面“Launch”转换。7. 查看日志与结果。执行转换过程会有信息输出到控制台。重点查看“步骤度量”、“日志”。
查看 outputdb 数据库中的 user 表。//命令行 output 用户登录
14
@>mysql -u output -p@>密码//使用 outputdb 数据库use outputdb;//这句很重要(查询也需要),不然会乱码set names gb2312;select * from user;
8.创建 Job。如果我们需要让这个转换定时执行怎么办呢,那么我们需要建立一个作业
Job。新建一个作业(Job),保存(到资源库)。
9.分别将 START(通用)和 Transformation(通用)组件拖到主工作台上,
按住 Shift 键,同时,点击一个组件,形成被选中的状态,拖动到目标组件上。15
于是,形成一个数据流向的箭头(hop)。显示效果如下图所示。
10.配置 START 和 Transformation 组件。START 组件就是一个调度组件,可以配置这个作业什么时间执行。例如:
每天的 12 点执行。
Transformation 组件配置,使用“Kettle file repository”类型资源库的时候通
过“转换文件名”选取转换文件配置这个作业需要执行的转换;“ Kettle
database repository”类型资源库则使用“转换名称”选取一个资源库中的转换对
象配置这个作业需要执行的转换。
16
11. 保存作业后运行。按 F9,或选择“Action”-->“执行”,在执行作业界面“Launch”作业。
案例之后
通过这两个简单的案例,是不是觉得 Kettle 简约而不简单。但通常能领悟
到这几个事实。1.业务比技术重要。2.数据的异构性与造成 ETL 的繁杂。3.调度与执行是 ETL 的核心。
17