问题描述

问题描述/异常栈

java.lang.IllegalArgumentException: id isn't [Type: decimal], it's int64

解决方案

1、源表使用和kudu匹配的字段类型;

2、关系型数据库通过自定义表达式使用cast函数进行类型转换。

3、当报错信息是isn't [Type: decimal]。mysql的bigint unsigned会被Spark转成Decimal(20, 0),可以使用自定义表达式进行类型转换。cast(id as signed)。

4、去向数据源为 kudu的,通过cast 无法处理的,可以在任务层面配置自定义参数:
       target.supportedCastTypeList=kudu
   或者 在 easyops 数据传输新增配置组,ndi.client.properties,再在里面新增参数
       ndi.spark.spark-conf.spark.transmit.common.supportedCastTypeList=kudu
   同步配置client组件,可以全局层面批量转换与去向字段类型不兼容的来源表字段类型

问题原因

此类报错是因为来源字段和kudu的字段类型不匹配导致,可以检查来源表字段类型和kudu的字段类型是否一致,如果使用了函数,也要检查函数的返回值的类型,通过cast函数进行类型转换。

作者:常惠渊