Pentaho Data Integration 数据集成
什么是 Pentaho
Pentaho Data Integration (PDI) 提供抽取、转换和加载 (ETL) 功能,使用统一的方式实现了一系列复杂的ETL过程。
如果你第一次接触 Pentaho,你可能会看到或听到 Pentaho 数据集成称为“Kettle”。Pentaho Data Integration 最初是一个名为“Kettle”的开源项目。术语 KETTLE 是一个递归术语,代表 Kettle Extraction Transformation Transport Load Environment。Pentaho 收购 Kettle 后,更名为 Pentaho Data Integration。其他 PDI 组件(例如Spoon、Pan和Kitchen)的名称最初是为了支持 ETL 产品的“烹饪”隐喻。
PDI 常见用途
PDI 客户端(也称为 Spoon)是一个桌面应用程序,使你能够构建转换以及安排和运行作业。
PDI 客户端的常见用途包括:
- 不同数据库和应用之间的数据迁移。
- 充分利用云、集群和大规模并行处理环境将大量数据集加载到数据库中。
- 数据清洗,步骤从非常简单到非常复杂的转换。
- 数据集成,包括利用实时 ETL 作为 Pentaho Reporting 数据源的能力。
- 内置支持缓慢变化的维度和代理键创建的数据仓库填充(如上所述)。
- 转换步骤:执行 ETL 任务。
- 作业条目:编排 ETL 活动,例如定义流程、依赖项和执行准备。
- 定时作业调度:您可以在特定时间运行作业。
- 数据流分析:您可以从消息流中检索数据,然后在近乎实时的处理后获取它。
更多特性请参考官方产品文档:
https://help.pentaho.com/Documentation/9.1/Products/Pentaho_Data_Integration
下载安装 PDI 客户端
访问Hitachi Vantara官网下载社区版。
也可以访问GitHub拉取源码手动编译安装,网上教程很多。
下载完成后解压即可,这里下载的版本是9.1.0.0-324
。
启动 PDI 客户端
-
将jdk拷贝到PDI根目录,为PDI配置单独的jdk。
# 用编辑器打开Kettle 根目录下的 Spoon.bat文件(linux下是spoon.sh) set JAVA_HOME=%cd%/jdk1.8_144 set PENTAHO_JAVA_HOME=%JAVA_HOME%
-
转到 PDI 解压目录。例如 ...\pentaho\design-tools\data-integration-9.1.0.0-324
-
以最适合您的操作系统的方式启动 PDI 客户端。
- Windows:双击Spoon.bat
- Linux:双击spoon.sh
- Macintosh:转至.../pdi-ee/data-integration并双击Data Integration图标。
案例1)级联数据清洗
数据表结构如下图所示,我们发现学校、班级、学生id字段的编码是有一定规则的。如果数据表没有设置外键约束,随着系统上线时间跨度的增加,出现的需求变更、开发和运维人员的更替,可能会出现数据约束和描述不符,出现脏数据造成报表和统计不正确,无法反映真实情况。
为了简化问题,我们限定了脏数据的影响范围,手动模拟了这种情况作为案例演示PDI的使用,问题数据集中在学校、班级、学生、学生课程中间表中并且上下级关系正确。并用以下SQL语句检查。
SELECT *,IF(SUBSTR(id,1,6) = sys_area_id,\'相等\',\'不相等\') FROM school;
SELECT *,IF(SUBSTR(id,1,8) = school_id,\'相等\',\'不相等\') FROM class;
SELECT *,IF(SUBSTR(id,1,10) = class_id,\'相等\',\'不相等\') FROM student;
SELECT * FROM student INNER JOIN student_course ON student.id = student_course.student_id;
我们的目标是将问题数据转存到其他同结构的表中,具体步骤如下。
连接数据库
右键转换选择新建转换 -> 右键DB连接选择新建。
输入JDBC连接参数,点击测试出现找不到数据库驱动错误。
下载对应的mysql驱动放到PDI主目录的lib下,重启PDI客户端,再次点击测试按钮,提示我们测试成功。
设置数据库编码
切换至选项菜单,在命令参数列新增characterEncoding
参数值为utf8
点击确定。
用到的组件说明
表输入
https://help.pentaho.com/Documentation/9.1/Products/Table_Input
表示出
https://help.pentaho.com/Documentation/9.1/Products/Table_Output
字段选择
https://help.pentaho.com/Documentation/9.1/Products/Select_Values
编写转换步骤
从核心对象列表选择表输入拖放到右侧,双击打开表输入,查询所有学校信息,同时准备出正确的学校id(new_id)。
从核心对象列表选择表输入拖放到右侧,按住shift
键从学校拖到表输出,双击打开表输出,将正确的学校id映射到id字段,参照下图进行配置。
同结构的表需要事先手动建好,也可以使用PDI创建,这里采用手动创建的方式为大家演示表名为school_01。
从核心对象列表选择字段选择拖放到右侧,按住shift
键从学校拖到字段选择,双击打开字段选择,参照下图进行配置,为下一步转换做准备。
从核心对象列表选择表输入拖放到右侧,按住shift
键从学校id拖到表输入,双击打开表输入,参照下图进行配置。
从核心对象列表选择表输出拖放到右侧,按住shift
键从班级拖到表输出,双击打开表输出,分别将正确的班级和学校id映射到目标表的班级和学校id字段,参照下图进行配置。
重复以上步骤完成其他数据表的数据转换,保存转换点击运行。
至此完成了此次转换,接下来我们来验证一下转换后的数据
数据清洗验证
SELECT *,IF(SUBSTR(id,1,6) = sys_area_id,\'相等\',\'不相等\') FROM school_01;
SELECT *,IF(SUBSTR(id,1,8) = school_id,\'相等\',\'不相等\') FROM class_01;
SELECT *,IF(SUBSTR(id,1,10) = class_id,\'相等\',\'不相等\') FROM student_01;
SELECT * FROM student_01 INNER JOIN student_course_01 ON student_01.id = student_course_01.student_id;
思考
思考一下这个案例如果不用PDI转换而使用SQL语句可不可以完成呢?如果不是要求转存转换结果而是要求更新原有数据表呢?
数据库脚本我会附到GitHub上,有兴趣的小伙伴可以尝试一下。
https://github.com/Walk-forward/blog-garden/blob/master/PentahoDataIntegration/student_database.sql