Pentaho Data Integration 数据集成
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
原文地址:https://www.cnblogs.com/mybdss/p/14878732.html
- Robert Xiao:下一个触点在哪里?
- 使用脚本操作UpdatePanel中控件的问题
- Gerrit上分支操作记录(创建分支、删除分支)
- flash 显示 qq客服状态
- android获得ImageView图片的等级
- SqlServer:此数据库处于单用户模式,导致数据库无法删除的处理
- jQuery中排除指定元素,同时选择剩下的所有元素
- windows客户机连接gerrit的一个报错处理
- 装箱与值类型虽然很容易理解,但是在实际使用中,并不总是能100%用对
- Jexus 配置ssl
- 局部打印插件 jquery.PrintArea.js
- FluorineFx应用中“页面长时间不动”导致无法连接的解决办法
- Mysql主从同步(1)-主从/主主环境部署梳理
- mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 微服务[学成在线] day16:基于Spring Security Oauth2开发认证服务
- 新的跨域策略:使用COOP、COEP为浏览器创建更安全的环境
- CVE-2020-1948:Dubbo Provider默认反序列化复现
- R语言进阶之因子分析
- Spring Boot 整合Thymeleaf
- Spring Boot 整合Shiro
- 微服务[学成在线] day01:CMS接口开发
- 微服务[学成在线] day02:CMS前端开发
- ggplot2| 绘制KEGG气泡图
- 微服务[学成在线] day03:CMS页面管理开发
- ggplot2|绘制GO富集柱形图
- 使用Prometheus监控Flink
- 微服务[学成在线] day04:页面静态化
- Spring Boot 整合Mybatis代码生成插件
- Spring Boot 配置文件