Spark出错:No applicable constructor/method found for actual parameters “...types.Decimal“

今天调试一段spark代码,收到一个错误:

CompileException: File ‘generated.java’, Line 60, Column 30: No applicable constructor/method found for actual parameters “org.apache.spark.sql.types.Decimal”; candidates are: public Integer Integer.valueOf(String, int)…, Integer.valueOf(int)…

从消息字面理解,应该是一个字段java里面是Integer, 而spark sql里面则是Decimal类型(Spark也写得太笨了点,基本转型都没做完全吗?)。由于spark计算有延后性,而且算式很长,步骤很多,为了确定是哪儿的问题,也是很费劲,我就把那个可疑的长语句refactoring成很多个小语句,每个函数都生成一个局部变量,然后在长语句后面打一个断点,中断后,对每个变量都evaluate一下count函数,迫使每个操作实时执行一下,很快就定位到了一个spark sql查询转换成java bean时报错。于是,就想办法进行类型转换,先是在sql中加 cast(0 as integer)这样,但结果还是一样,进了spark后数据类型就变成了Decimal. 看来只能在DataSet里面转型了,于是加上如下语句:

dataset = dataset.withColumn("asset_count", dataset.col("asset_count").cast(DataTypes.IntegerType));

再测试一下,问题解决了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值