Pentaho表输出步骤在日志中未显示正确错误

Pentaho表输出步骤在日志中未显示正确错误,pentaho,netezza,Pentaho,Netezza,在Pentaho中,我有一个表输出步骤,将大量记录加载到netezza目标表中 其中一行出现故障,日志会向我显示导致问题的值。但日志可能不正确,因为当我使用这些值创建一个insert语句并在数据库上单独运行它时,它可以正常工作 我的问题是: 在Pentaho中,有没有一种方法可以确定当db插入失败时,究竟是哪些值导致了问题,为什么 编辑:错误为“超出列宽”,它向我显示了可能导致问题的值。但我用这些值做了一个insert语句,效果很好。因此,我认为Pentaho没有向我显示正确的错误消息,是一组不

在Pentaho中,我有一个表输出步骤,将大量记录加载到netezza目标表中

其中一行出现故障,日志会向我显示导致问题的值。但日志可能不正确,因为当我使用这些值创建一个insert语句并在数据库上单独运行它时,它可以正常工作

我的问题是: 在Pentaho中,有没有一种方法可以确定当db插入失败时,究竟是哪些值导致了问题,为什么


编辑:错误为“超出列宽”,它向我显示了可能导致问题的值。但我用这些值做了一个insert语句,效果很好。因此,我认为Pentaho没有向我显示正确的错误消息,是一组不同的值导致了问题。

我不知道您的问题到底是什么,但我认为我以前也遇到过同样的问题

一切似乎都是正确的,但问题是在某些转换中,例如,当我将数值转换为字符串时,转换在字段末尾添加了一个空格,字段的长度是
n+1
,而不是
n
,但这很难看到

一个实际的例子是,如果您正在使用计算器步骤进行转换,您可以使用
YEAR()
函数提取日期字段的年份,并且可能在带有年份的新字段中添加了一个空格,因此如果年份的长度为4,则在该步骤之后,它的长度将为5,并且当您要加载行时(该年份字段是
字符串(5)
)输入数据仓库,并且在您的数据仓库中预期是
字符串(4)
,您将得到与现在相同的错误

You think is happening --> year = "2013"   --> length 4
Really is happening    --> year = "2013 "  --> length 5
我建议您非常注意字符串字段及其长度,因为如果某些转换添加了一个空白,您不希望会浪费大量时间来查找错误(我自己的经验)

我希望这对你有用


编辑:我猜你正在使用PDI(汤匙,在水壶之前)加载数据仓库时会产生错误,如果我错了,请纠正我。

我处理此类问题的另一种方法是在数据库中创建另一个具有加宽列类型的表。然后在转换中,添加连接到新表的
表输出
步骤。然后连接原始
表e将
输出到新步骤,但当被询问时,选择“错误处理”作为跃点类型

当您运行转换时,有问题的行将在新表中结束。然后您可以确切地调查特定行的问题所在

例如,您可以执行以下操作:

insert into [original table] select * from [error table];

与JDBC驱动程序相比,您可能会从本机DB接口获得更好的错误消息。

您是否可以将该文件与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>
nzload-u-pw-host-db-t-df-lf-bf-delim

我猜您的输入集中有重复的值。因此,您加载一个键值,然后在一堆行之后尝试加载相同的值,并得到一个重复的键值错误。如果是这种情况,并且您无法从输入集中获取DUP,您可以使用
唯一值
步骤将其过滤掉。如果您的“问题”不是重复的键错误,请公布它是什么。谢谢你,你能看看我的编辑,看看它是否有助于调试。听起来像@carexcer在上面。如果你公布你试图加载的表的DDL也会很有帮助。当你“用这些值生成并插入语句”时,你是否直接从错误日志中复制了这些值?谢谢,我检查了每个字段,我认为日志中显示为“问题值”的值不是问题。导致问题的实际值没有显示在日志中。你能提供提供日志的完整错误吗?也许你是对的,但如果我看到完整的错误消息,我可以帮助你更多。如果你能ovide你正在使用的步骤会更好,因为有些步骤转换有问题,有时需要使用其他方法来做一些事情。谢谢,我会这样做。再次感谢你,伙计,感谢你的帮助。好主意,我星期一第一件事就是尝试。如果你需要的话,你可以做的另一件事是在上游放置一个序列计数器在转换中,在错误表中添加一列来存储该行。然后,当该行到达错误表中时,您就可以确切地知道正在中断的是输入集中的哪一行。