Java 在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。 当我尝试这样做时,我得

我在Hive中开发UDTF时遇到问题ClassCastException

详情如下:

  • 我试图实现for循环的功能,在这里我可以传递三个参数,比如for_(开始、停止、增量)
  • 如果我将所有参数作为一个值传递,就像每个(1,10,1)的值一样,它可以正常工作
  • 然而,对于stop value参数,我试图传递其中一个UDF函数的结果(例如,stopvlaue()值,类似于_each(1,stopvalue(),1)。stopo dovalue()函数返回我IntWritable。 当我尝试这样做时,我得到以下异常: “ClassCastException org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableInObjectInspector不能强制转换为org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableConstantIntObjectInspector”
  • 这是我的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
    
        }
    }
    
    公共类生成器扩展了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])