我在Hive中开发UDTF时遇到问题ClassCastException。
以下是详细信息:
这是我的UDTF:
public class GenerateSeries extends GenericUDTF {
IntWritable start;
IntWritable end;
IntWritable inc;
Object[] forwardObj = null;
@Override
public StructObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException
{
start=((WritableConstantIntObjectInspector) args[0]).getWritableConstantValue();
end=((WritableConstantIntObjectInspector) args[1]).getWritableConstantValue();
if (args.length == 3)
{
inc =((WritableConstantIntObjectInspector) args[2]).getWritableConstantValue();
} else {
inc = new IntWritable(1);
}
this.forwardObj = new Object[1];
ArrayList<String> fieldNames = new ArrayList<String>();
ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>();
fieldNames.add("col0");
fieldOIs.add(PrimitiveObjectInspectorFactory.getPrimitiveJavaObjectInspector(PrimitiveCategory.INT));
return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
}
@Override
public void process(Object[] args) throws HiveException, UDFArgumentException
{
for (int i = start.get(); i < end.get(); i = i + inc.get())
{
this.forwardObj[0] = new Integer(i);
forward(forwardObj);
}
}
@Override
public void close() throws HiveException {
// TODO Auto-generated method stub
}
}
任何想法如何解决此问题?
提前致谢
答案 0 :(得分:0)
在大多数情况下,initialize
方法不会为您提供函数输入的实际值,因为对于不同的行可能会有所不同。它只告诉您输入的类型。只能从process
方法一致地访问实际值。您目前正在利用一个值得注意的例外,即常量。你应该遵循的一般模式是:
initialize
方法中的实例变量中。您可以检查它们是您期望的类型,但它们并不总是WritableConstantIntObjectInspector
。它们应该始终是PrimitiveObjectInspector
的子类,如果您调用getPrimitiveCategory
方法,则应该返回PrimtiveCategory.INT
。process
方法的对象中的数据。例如,Integer n = (Integer)inspector.getPrimitiveJavaObject(args[0])