windows下kettle使用gpload加载数据到greenplum

使用gpload需要先安装几个软件,安装顺序是

python-2.5.4.msi
PyYAML-3.05.win32-py2.5.exe
PyGreSQL-4.1.1.win-amd64-py2.5.msi
PyGreSQL-4.1.1.win-amd64-py2.5.exe
greenplum-loaders-4.3.26.0-WinXP-x86_32.msi

python必须是2.5.4版本,因为gpload的windows版使用的是2.5.4,不然可能会出现奇怪的错误,2、3、4安装的软件需下载跟python对应的版本

使用gpload需保证gpdb服务器与ETL服务器ping互通

下面是kettle里gpload的使用

gpload依赖gpfdist,使用前需先启动gpfdist,在greenplum-loaders安装目录/bin下有个gpfdist.exe,双击即可

这里写图片描述

 load method有两个选项,Automatic load (at the end)代表自动执行gpload加载数据;Manual load (only creation of files)代表手动执行,只生成cfg,dat文件,需要手动执行gpload命令;cfg文件是gpload的yml文件,dat是需要加载的数据文件

 erase cfg/dat files after use这个选择是指使用后是否删除cfg,dat文件

load action(加载方式):insert(插入),update(更新),merge(合并,存在更新,不存在则插入),update和merge需要在字段列表中至少存在一个字段match为true,用户匹配更新的字段,match列后面还有一个update列,设为true表示遇到更新的记录行更新该字段。
注意:kettle里面的gpload字段的match和update好像设置无效,改为“是”保存在打开又变成了“否”,导致无法增量更新。本人目前解决方案是:直接修改转换文件,找到字段映射那块,手动修改为Y,暂时解决问题,可增量更新。

这里写图片描述

local host配置:port为gpfdist使用的端口,host为gpfdist的ip,不要使用127.0.0.1,使用的ip必须得greenplum库能ping通,port建议不设置,默认会在8000-9000选取可用端口,如果设置了port,需保证gpload并行执行时使用的端口不同,不然会端口冲突,导致失败。

这里写图片描述

GP Configuration (使用gpload的一些配置):

path to the gpload :D:\Program Files (x86)\Greenplum\greenplum-loaders-4.3.26.0\bin\python.py
control file :生成cfg文件保存的地址及control文件名
error table:加载出现错误的数据,填写了会自动在gp库中创建改表,加载错误的数据会存到改表中
log file :gpload运行日志
data file :生成的dat数据文件地址及dat文件名
Null as:null值替换
encoding:编码
max errors:允许错误数量
delimiter:数据字段列分隔符,建议使用一些特殊的字段,避免数据中存在该字符,倒是加载数据出现错误,或在执行gpload之前将数据中的特殊字符替换掉

kettle gpload常见错误:

1、missing data for column "xxx",这种错误如果数据导出没有问题,一般是由于数据中含有分隔符,或数据中含有转义字符,将分隔符转义导致。
2、gpload并行导入失败,单个导入成功,这个问题一般是gpfdist端口冲突了,并行的gpload任务gpfdist端口不能一样,建议gpload里面的端口不要设置,默认会在8000-9000选择可用端口,避免冲突。

kettle中使用gpload加载数据时,null as配置好像没有作用,null值导入进去后变成了”(两个单引号),查看gpload.py脚本发现这段代码

if nullas != False: # could be empty string
        self.formatOpts += "null %s " % quote_no_slash(nullas)
    elif formatType=='csv':
        self.formatOpts += "null '' "
    else:
        self.formatOpts += "null %s " % quote_no_slash("\N")

 一般我们可能需要将null值替换成孔字符串,需要将self.formatOpts += "null %s " % quote_no_slash("\N")
 修改为self.formatOpts += "null %s " % quote_no_slash("")

建议:

使用kettle环境变量,数据库连接等需要区分环境的配置使用变量,可以做到一个环境一份配置,无需切换环境时更改。环境变量可在.kettle.propeties文件里添加
数据装在到gp库前,先做一次字符集替换,将转义符、跟分隔符相同的字符替换掉,避免加载数据失败,下面附上js代码。

 for (var i=0;i < getInputRowMeta().size();i++){
    var valueMeta= getInputRowMeta().getValueMeta(i);
    if (valueMeta.getTypeDesc().equals("String")) {
        var fStr= row[i];
        fStr=replace(row[i],'\n','');
        fStr=replace(fStr,'\r','');
        fStr=replace(fStr,'\t','');
        fStr=replace(fStr,'\b','');
        row[i]=fStr;
    }
}

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值