如何解决 Kettle 中的这个 in/out mysql 参数错误?

Posted

技术标签:

【中文标题】如何解决 Kettle 中的这个 in/out mysql 参数错误?【英文标题】:How to work around this in/out mysql parameter bug in Kettle? 【发布时间】:2015-09-12 08:37:44 【问题描述】:

我正在使用 Kettle 进行转换并遇到同样的问题,试图在 mysql 中获取基于整数的“out”参数的值,(该字段实际上应该是 bigint,但我认为它不支持水壶)。

How to retrieve OUT parameter from MYSQL stored procedure to stream in Pentaho Data Integration (Kettle)?

我已经用小数实现了这个确切问题的解决方法,但我有一个地狱般的时间试图首先将值返回到 id 字段(不是id_1),然后将其转换回一个整数,因此它可以插入到数据库中。

这是相关流程:

这是步骤定义:

在来自lookup existing id 的入站流中,已经添加了一个名为id 的字段,它是一个小数,可以是一个值,也可以是空值。如果它为空,它会在filter rows 步骤触发此数据库过程查找,换句话说,它在db procedure 步骤将始终为空(因此我不能在此处使用输入输出参数)。

所以我想要发生的是当它离开db procedure 步骤时,id 应该填充 out 参数的值(理想情况下它是一个整数,但由于这个错误,我可以接受小数)。但相反,我将id_1 插入到流中。

然后再往下走,假设我将 id 字段中的值作为小数,然后我需要将其转换回整数,以便可以将其插入数据库而不会出错。不过,我真的不知道如何在 Kettle 中编写 javascript,也找不到有关该语言的文档。

所以我的问题是双重的:

    我可以让 db 过程将id 重新插入到流中吗? 如何编写脚本(或使用步骤)将id(或id_1)转换为整数并将其放回流中的id 字段?

【问题讨论】:

【参考方案1】:

Kettle 基于 Java 构建并使用 JDBC 驱动程序。让我总结一些来源并调查问题(我将包括 Postgresql,因为我最常使用它并且这些信息对我很有价值)

http://wiki.pentaho.com/display/EAI/PDI+Rows+Of+Data https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html http://www.tutorialspoint.com/jdbc/jdbc-data-types.htm

首先我们检查数据类型的大小:java.util.Long 是 8 字节长,mysql bigint 类型是 8 字节长,postgresql bigint 类型也是 8 字节长。除了一个问题外,它们实际上匹配的物理尺寸。 Mysql 支持 unsigned bigint,它超出了 java.util.Long 的范围。我假设问题出现在 java.util.Long 的边缘值、最小值和最大值上。

无论如何我都试图重现(在 Postgres 上只对我可用)

Postgresql 9.4,JDBC 驱动 postgresql-9.4-1201-jdbc41.jar,Kettle 5.4.0,jdk7

http://forums.pentaho.com/showthread.php?48950-loosing-precision-of-BIGINT-workaround

一切看起来都很好。很可能是 mysql jdbc 驱动程序有问题,或者是不支持 java.math.BigInteger 的水壶有问题。 java.math.BigInteger 是数据类型,用于处理 mysql 中的无符号 bigint 值,如此处所述

http://dev.mysql.com/doc/connector-j/en/connector-j-reference-type-conversions.html

关于实际问题。下面的解决方案示例:

示例 csv

"id" "surname"  "name"  "birth_dt"
"1" "Gorovits"  "Alex"  "2001-01-01"
"2" "Osmani"    "Adeb"  "1998-03-06"
""  "Maiters"   "John"  "1981-07-07"
""  "Mateus"    "Angela"    "2004-04-04"
"5" "Sander"    "Tom"   "1990-05-05"

注意事项:

DBLookup 不适用于空值,因此您可能需要在运行 DBLookup 之前过滤具有空值的行。

【讨论】:

好的,谢谢,我实际上已经完成了这项工作,我找到了一个“setField”步骤,用于从 id_1 中取出值并将其分配回 db 过程分支中的 id。然后我不知道怎么做,但我让 Integer 也能正常工作,所以之前可能是其他一些问题导致了异常。但现在它无论如何都可以工作了,我完全去掉了 Javascript 步骤。

以上是关于如何解决 Kettle 中的这个 in/out mysql 参数错误?的主要内容,如果未能解决你的问题,请参考以下文章

ETL工具kettle简单的性能调优

打开kettle时报错

kettle如何在输入流中增加字段,具体怎么做?

kettle字段改为空

kettle合并记录 新旧表明明关键字段id一致结果老数据标记删除,新数据标记插入,求解

如何彻底解决Kettle无法连接MySQL8的缺陷?