Java 在Hive中开发UDTF时获得ClassCastException
我在Hive中开发UDTF时遇到问题ClassCastException 详情如下:Java 在Hive中开发UDTF时获得ClassCastException,java,hadoop,hive,Java,Hadoop,Hive,我在Hive中开发UDTF时遇到问题ClassCastException 详情如下: 我试图实现for循环的功能,在这里我可以传递三个参数,比如for_(开始、停止、增量) 如果我将所有参数作为一个值传递,就像每个(1,10,1)的值一样,它可以正常工作 然而,对于stop value参数,我试图传递其中一个UDF函数的结果(例如,stopvlaue()值,类似于_each(1,stopvalue(),1)。stopo dovalue()函数返回我IntWritable。 当我尝试这样做时,我得
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
}
}
公共类生成器扩展了GenericUDTF{
可写启动;
可写端;
IntWritable公司;
Object[]forwardObj=null;
@凌驾
公共结构ObjectInspector initialize(ObjectInspector[]args)引发UDFArgumentException
{
start=((WritableConstantObjectInspector)参数[0])。getWritableConstantValue();
end=((WritableConstantObjectInspector)参数[1])。getWritableConstantValue();
如果(args.length==3)
{
inc=((WritableConstantObjectInspector)args[2]).getWritableConstantValue();
}否则{
inc=新的可写整数(1);
}
this.forwardObj=新对象[1];
ArrayList fieldNames=新的ArrayList();
ArrayList fieldOIs=新的ArrayList();
fieldNames.add(“col0”);
add(PrimitiveObjectInspectorFactory.getPrimitiveJavaObjectInspector(PrimitiveCategory.INT));
返回ObjectInspectorFactory.getStandardStructObjectInspector(字段名、字段OIS);
}
@凌驾
公共无效进程(对象[]args)抛出HiveException、UDFArgumentException
{
for(int i=start.get();i
你知道我该如何解决这个问题吗
提前感谢在大多数情况下,
初始化
方法不会为您提供函数输入的实际值,因为不同行的实际值可能不同。它只会告诉您输入的类型。实际值只能通过过程
方法一致访问。您当前正在使用一个值得注意的例外是常数。您应该遵循的一般模式是:
initialize
方法中的实例变量中。您可以检查它们是否是您期望的类型,但它们并不总是可写的ConstantObjectInspector
。它们应该始终是PrimitiveObjectInspector
的子类,如果您调用getPrimitiveCategory
的话霍德,你应该回去primitivecategory.INT
进程
方法的对象中的数据。例如,整数n=(整数)检查器。getPrimitiveJavaObject(args[0])