ETL工具Kettle对PostgreSQL操作的基本介绍

用途和背景

ETL (extract, transform, load)工具是用于数据库数据迁移清洗处理等操作的工具。

我们有时会面临一种情况:实时运行的系统由于需求的变化而去更新DB的结构,这样便需要收集系统实时运行的数据,然后将其传入到新的DB结构中去,以确保实时运行的数据不会丢失。当然我们可以通过SQL(在没有bytea字段的情况下)或JDBC去完成整个流程,但是这样做远远不如ETL高效。

Bug修改

在Kettle中,在处理PostgreSQL数据时候,我们目前发现2个会对工作产生影响的Bug。其一是对bytea数据的处理,其二是对boolean数据的处理。我们可以简单对它的源码进行修改,使它可以运行起来。

修改一(对Bytea部分Bug的修改)

修改了org.pentaho.di.core.database.Database.java中关于Blob的处理

更改前为:

case ValueMetaInterface.TYPE_BINARY :

{

     if (databaseMeta.supportsGetBlob()){

             Blob blob = rs.getBlob(i+1);

             //这里连接数据库为postgresql时,会抛出异常

             if (blob!=null){

                      data[i] = blob.getBytes(1L, (int)blob.length());

             }else{

                      data[i] = null;

             }

     }

     else{

             data[i] = rs.getBytes(i+1);

     }

}

break;

更改后为:

case ValueMetaInterface.TYPE_BINARY :

{

     if (databaseMeta.supportsGetBlob()){

             try{

                      Blob blob = rs.getBlob(i+1);

                      if (blob!=null){

                            data[i] = blob.getBytes(1L, (int)blob.length());

                      }else{

                               data[i] = null;

                      }

             }catch(Exception ex){

                      try{

                               data[i] = rs.getBytes(i+1);

                      }catch(Exception e){

                               data[i] = null;

                      }

             }

     }else{

             data[i] = rs.getBytes(i+1);

     }

}

break;

修改二(对boolean部分Bug的修改)

修改了org.pentaho.di.core.database. PostgreSQLDatabaseMeta.java中关于Boolean类型的处理,在默认情况下即PostgreSQLDatabaseMeta 的基类BaseDatabaseMeta中是默认不支持Boolean数据类型的, supportsBooleanDataType返回值是false,我们在PostgreSQLDatabaseMeta中overwrite这个函数以实现Kettle对PostGreSQL中关于Boolean数据类型的支持。

public boolean supportsBooleanDataType() {

return true;

}

修改这两处后,利用ant进行重新build,就可以生成全新的Kettle。 但是在修改二中这样做又引入了新的Bug,即不能将Kettle的repository创建到PostgreSQL中,这样也就意味着我们不能以PostgreSQL数据库形式共享项目文件。但是这样做的好处是极大的方便我们日常的工作,可以方便的进行数据迁移清洗等操作。当我们需要进行项目共享的时候,我们可以通过CVS等方式实现repository共享。

基本概念

我们常使用Spoon(是Kettle中的一个子项目)进行数据transfer,这里只是自己对下面一些基本概念的理解,具体请自行参见Spoon的文档。

Transform:定义了数据transfer的基本操作流程,通常包括Input, Output和Hop

Job:定义了一组数据transfer的操作流程,可以包括多个Job或transform。

Input:定义了数据流的起点

Output:定义了数据流的终点

Step:是transform的基本构成点,Input和Output都是一种step

DB Connection:定义了数据库连接的名字,通常和Input以及Output配合使用

Start:定义了Job中transfer的起点

Hop:表示Step间数据的流向

SQL脚本:JOB中多个Transform或子JOB之间表示需要执行的SQL脚本

以上仅仅是罗列了最基本最常用的Step, 在Spoon中还有多种Step可供使用以方便Job的设计和使用,具体的可以参见Spoon文档。

基本使用方法

A.新建一个Transform

一、打开Spoon,选择没有资源库

二、新建transform

三、新建 DB Connection

四、新建 input和output

五、建立input和output之间的数据流Hop

六、保存Transform

一个建立好的transform如图所示

B.新建一个子JOB

一、打开Spoon,选择没有资源库

二、新建JOB

三、新建DB Connection

四、新建Start节点

五、新建SQL脚本,设置要执行的脚本,选择必要的DB Connection

六、新建Transform节点,设置已经存在的Transform

七、建立多个Step之间的Hop

八、保存Job

一个建立好的子JOB如图所示

C、新建JOB

一、打开Spoon,选择没有资源库

二、新建JOB

三、新建Start节点

四、新建JOB节点,设置已经存在的JOB

五、建立多个Step之间的Hop

六、保存Job

————————————————
版权声明:本文为CSDN博主「jaytse」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jaytse/article/details/2985977

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值