在开发Hive UDF的时候遇到了一个异常:
java.lang.ClassCastException: org.apache.hadoop.io.DoubleWritable cannot be cast to org.apache.hadoop.hive.serde2.io.DoubleWritable排查原因
查看编写的udf代码:
@Override
public Object evaluate(DeferredObject[] arguments) throws HiveException {
double result =
return new DoubleWritable(result);
}
代码里引用的是org.apache.hadoop.io.DoubleWritable这个类,但是hive需要使用org.apache.hadoop.hive.serde2.io.DoubleWritable这个类,于是抛出了异常。
解决方案修改引用import org.apache.hadoop.hive.serde2.io.DoubleWritable;
思考为什么hive要有自己的DoubleWritable呢?
查看hive源码:
package org.apache.hadoop.hive.serde2.io;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;
public class DoubleWritable extends org.apache.hadoop.io.DoubleWritable {
public DoubleWritable() {
super();
}
public DoubleWritable(double value) {
super(value);
}
static { // register this comparator
WritableComparator.define(DoubleWritable.class, new Comparator());
}
}
可以看到这个类的目的是兼容老版本的hadoop,并且也考虑在未来的版本中移除。
我这边目前还在使用2.X的hadoop,截至目前(2022.03.01)hive最新的版本为2.3.9,仍然保留了这个类。
总结未来在开发hive udf的时候要注意使用org.apache.hadoop.hive.serde2.io.DoubleWritable.



