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));

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

你可能感兴趣的:(spark,大数据)