首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Hive中开发UDTF时获取ClassCastException

在Hive中开发UDTF时获取ClassCastException
EN

Stack Overflow用户
提问于 2013-10-07 16:24:41
回答 1查看 1K关注 0票数 0

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

详情如下:

  1. 我正在尝试实现for循环类的功能,在这里我可以传递三个参数,比如for_each(开始、停止、增量)。
  2. 如果我将所有参数作为像for_each(1,10,1)这样的值传递,那么它工作得很好。
  3. 然而,对于stop值参数,我试图传递其中一个UDF函数的结果(例如。与for_each(1,stopvalue(),1)类似的值。函数返回me IntWritable。当我尝试这样做时,我得到了下面的例外:“不能将org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableIntObjectInspector转换为org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableConstantIntObjectInspector”

这是我的UDTF:

代码语言:javascript
复制
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

    }
}

你知道我该怎么解决这个问题吗?

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2013-10-07 21:06:23

在大多数情况下,initialize方法不会给出函数输入的实际值,因为对于不同的行,这可能是不同的。它只告诉您输入的类型。只有从process方法才能一致地访问实际值。您目前正在利用一个值得注意的例外,那就是常量。相反,您应该遵循的一般模式是:

  1. 将输入检查器存储在initialize方法中的实例变量中。您可以检查它们是否是您所期望的类型,但它们并不总是WritableConstantIntObjectInspector。它们应该始终是PrimitiveObjectInspector的子类,如果调用getPrimitiveCategory方法,则应该返回PrimtiveCategory.INT
  2. 使用存储的输入检查器检索传递给process方法的对象中的数据。例如,Integer n = (Integer)inspector.getPrimitiveJavaObject(args[0])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19229877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档