Pentaho Data Integration:双流合并保存至同一JSON文件异常排查
嘿,这个问题我之前在做Pentaho转换的时候也碰到过!那些[B@xxxxxx的字符串其实是Java里字节数组(byte[])默认toString()方法的输出——说白了就是你的数据在合并后,某些列被意外转成了字节数组,而不是原来的数值类型,所以JSON输出的时候就直接把这个数组的内存标识打出来了。
问题原因分析
- 数据流合并时的类型不匹配:两条数据流中对应列的数据类型不一致,比如一条是数值型(Integer/Double),另一条在处理流程中被隐性转换成了字节数组,合并后Pentaho没有自动完成正确的类型转换,导致最终输出时直接输出了字节数组的默认字符串表示。
- 转换步骤中的隐性类型转换:比如其中一条数据流使用了
Binary Encoding、自定义Java脚本这类步骤,不小心把数值列转成了字节数组;单独输出时Pentaho可能会做自动类型适配,但合并后元数据冲突,适配失败。 - JSON输出步骤的配置问题:合并后的字段元数据被覆盖,JSON输出步骤没有正确识别字段类型,直接按原始对象(字节数组)输出,没有做类型转换。
解决方法
- 统一两条数据流的字段类型:
- 分别查看两条数据流中对应列的元数据(右键步骤→
Show output fields),确保合并前字段的名称、数据类型(比如都是Integer、Number)完全一致。 - 如果有不一致,在合并前给其中一条数据流添加
Convert Fields步骤,将字段转换成和另一条一致的类型。
- 分别查看两条数据流中对应列的元数据(右键步骤→
- 排查产生字节数组的步骤:
- 检查两条数据流中的所有步骤,比如是否使用了会生成字节数组的操作,或者在
User Defined Java Expression里不小心返回了byte[]类型。 - 举个例子,如果是脚本里返回了字节数组,改成
return new String(someBytes);或者直接转换成对应的数值类型(比如return Integer.parseInt(new String(someBytes));)。
- 检查两条数据流中的所有步骤,比如是否使用了会生成字节数组的操作,或者在
- 调整JSON输出步骤的配置:
- 在JSON输出步骤的
Fields选项卡中,找到异常字段,手动指定它的数据类型(比如设置为Number或String,而不是默认的Object)。 - 如果用了
Fast JSON模式,尝试切换到普通模式,它对字段类型的处理会更严格。
- 在JSON输出步骤的
- 用
Select Values步骤统一字段元数据:- 在合并之前,给两条数据流都加上
Select Values步骤,明确指定每个字段的名称和类型,确保合并时元数据完全匹配,避免Pentaho自动推断类型出错。
- 在合并之前,给两条数据流都加上
内容的提问来源于stack exchange,提问作者Pedro Henrique
相关产品推荐
相关产品推荐

