在Pentaho中,我有一个表输出步骤,我将大量记录加载到netezza目标表中。
其中一行失败,日志显示哪些值导致问题。但是日志可能不对,因为当我使用这些值创建一个insert语句并在数据库上单独运行时,它可以正常工作。
我的问题是: 在Pentaho中,有没有办法确定当数据库插入失败时,究竟是哪些值导致了问题?为什么?
编辑:错误是“超出列宽”'它向我展示了可能导致问题的价值观。但我用这些值做了一个插入语句,它运行良好。所以我认为Pentaho没有向我显示正确的错误消息,它是导致问题的一组不同的值。
答案 0 :(得分:1)
我完全不知道你的问题是什么,但我认为之前我遇到过同样的问题。
一切似乎都是正确的,但问题是在某些转换中,例如,当我将数值转换为字符串时,转换在字段的末尾添加了一个空格,字段的长度为{{1} }而不是n+1
,但这很难看到。
一个实际的例子是,如果您正在使用计算器步骤进行转换,您可以使用n
函数来提取日期字段的年份,也许可以使用年份添加空格的新字段,因此,如果年份长度为4,那么在该步骤之后它将具有5的长度,并且当您要将一行(具有该YEAR()
的年份字段)加载到数据仓库中时您的数据仓库期望string(5)
,您将得到与现在相同的错误。
string(4)
我建议你非常注意字符串字段及其长度,因为如果某些转换会添加一个空格,那么你可能会失去很多找时间的错误(我自己的经历)。
我希望这对你有用!
编辑:我猜你正在使用PDI(Spoon,在Kettle之前)并且在你加载数据仓库时出现错误,所以如果我错了就纠正我。
答案 1 :(得分:1)
我用来处理这类问题的另一种方法是在DB中创建另一个扩展列类型的表。然后在转换中,添加连接到新表的Table output
步骤。然后将原始Table output
连接到新步骤,但在询问时,选择“错误处理”作为跳转类型。
运行转换时,有问题的行将最终出现在新表中。然后,您可以准确调查该特定行的问题。
例如,您可以执行以下操作:
insert into [original table] select * from [error table];
您可能会从本机数据库接口获得比JDBC驱动程序更好的错误消息。
答案 2 :(得分:0)
您可以使用带有nzload命令的文件,使用此命令可以找到确切的错误,以及您提供的badFile中的错误记录以进行详细分析。
e.g。 -
nzload -u <username> -pw <password> -host <netezzahost> -db <database> -t <tablename> -df <datafile> -lf <logfile> -bf <badrecords file name> -delim <delimiter>