Pentaho Data Integration 数据集成

时间:2024-02-29 22:26:19

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 组件(例如SpoonPanKitchen)的名称最初是为了支持 ETL 产品的“烹饪”隐喻。

PDI 常见用途

PDI 客户端(也称为 Spoon)是一个桌面应用程序,使你能够构建转换以及安排和运行作业。

PDI 客户端的常见用途包括:

  • 不同数据库和应用之间的数据迁移。
  • 充分利用云、集群和大规模并行处理环境将大量数据集加载到数据库中。
  • 数据清洗,步骤从非常简单到非常复杂的转换。
  • 数据集成,包括利用实时 ETL 作为 Pentaho Reporting 数据源的能力。
  • 内置支持缓慢变化的维度和代理键创建的数据仓库填充(如上所述)。
  • 转换步骤:执行 ETL 任务。
  • 作业条目:编排 ETL 活动,例如定义流程、依赖项和执行准备。
  • 定时作业调度:您可以在特定时间运行作业。
  • 数据流分析:您可以从消息流中检索数据,然后在近乎实时的处理后获取它。

更多特性请参考官方产品文档:

https://help.pentaho.com/Documentation/9.1/Products/Pentaho_Data_Integration

下载安装 PDI 客户端

访问Hitachi Vantara官网下载社区版。

https://www.hitachivantara.com/en-us/products/data-management-analytics/pentaho/download-pentaho.html

也可以访问GitHub拉取源码手动编译安装,网上教程很多。

https://github.com/pentaho/pentaho-kettle

下载完成后解压即可,这里下载的版本是9.1.0.0-324

image-20210610200612238

启动 PDI 客户端

  1. 将jdk拷贝到PDI根目录,为PDI配置单独的jdk。

    # 用编辑器打开Kettle 根目录下的 Spoon.bat文件(linux下是spoon.sh)
    set JAVA_HOME=%cd%/jdk1.8_144
    set PENTAHO_JAVA_HOME=%JAVA_HOME%
    

    image-20210611092156916

  2. 转到 PDI 解压目录。例如 ...\pentaho\design-tools\data-integration-9.1.0.0-324

  3. 以最适合您的操作系统的方式启动 PDI 客户端。

    • Windows:双击Spoon.bat
    • Linux:双击spoon.sh
    • Macintosh:转至.../pdi-ee/data-integration并双击Data Integration图标。

image-20210610233214474

案例1)级联数据清洗

数据表结构如下图所示,我们发现学校、班级、学生id字段的编码是有一定规则的。如果数据表没有设置外键约束,随着系统上线时间跨度的增加,出现的需求变更、开发和运维人员的更替,可能会出现数据约束和描述不符,出现脏数据造成报表和统计不正确,无法反映真实情况。

image-20210610221207938

为了简化问题,我们限定了脏数据的影响范围,手动模拟了这种情况作为案例演示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;

image-20210612102943482

我们的目标是将问题数据转存到其他同结构的表中,具体步骤如下。

连接数据库

右键转换选择新建转换 -> 右键DB连接选择新建

image-20210610233914860

输入JDBC连接参数,点击测试出现找不到数据库驱动错误。

image-20210611171344388

下载对应的mysql驱动放到PDI主目录的lib下,重启PDI客户端,再次点击测试按钮,提示我们测试成功。

image-20210611171519072

设置数据库编码

切换至选项菜单,在命令参数列新增characterEncoding参数值为utf8点击确定。

image-20210611172046083

用到的组件说明

表输入

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)。

image-20210611211730433

核心对象列表选择表输入拖放到右侧,按住shift键从学校拖到表输出,双击打开表输出,将正确的学校id映射到id字段,参照下图进行配置。

同结构的表需要事先手动建好,也可以使用PDI创建,这里采用手动创建的方式为大家演示表名为school_01。

image-20210611213811219

核心对象列表选择字段选择拖放到右侧,按住shift键从学校拖到字段选择,双击打开字段选择,参照下图进行配置,为下一步转换做准备。

image-20210611215202830

核心对象列表选择表输入拖放到右侧,按住shift键从学校id拖到表输入,双击打开表输入,参照下图进行配置。

image-20210612091518348

核心对象列表选择表输出拖放到右侧,按住shift键从班级拖到表输出,双击打开表输出,分别将正确的班级和学校id映射到目标表的班级和学校id字段,参照下图进行配置。

image-20210612091738880

重复以上步骤完成其他数据表的数据转换,保存转换点击运行。

image-20210612092415176

image-20210612093339186

image-20210612095327543

至此完成了此次转换,接下来我们来验证一下转换后的数据

数据清洗验证

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;

image-20210612172013106

思考

思考一下这个案例如果不用PDI转换而使用SQL语句可不可以完成呢?如果不是要求转存转换结果而是要求更新原有数据表呢?

数据库脚本我会附到GitHub上,有兴趣的小伙伴可以尝试一下。

https://github.com/Walk-forward/blog-garden/blob/master/PentahoDataIntegration/student_database.sql