首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >配置单元UDTF返回ArrayList列

配置单元UDTF返回ArrayList列
EN

Stack Overflow用户
提问于 2014-12-18 13:42:16
回答 1查看 1.1K关注 0票数 2

我是Hive UDTF的新手。我有一个要求,我必须将字符串值作为参数传递到UDTF中,并且返回的列应该是ArrayList。

我写了以下代码:

代码语言:javascript
复制
public StructObjectInspector initialize(ObjectInspector[] arg0)
        throws UDFArgumentException {
        ArrayList<String> fieldNames = new ArrayList<String>();
        ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>();
        fieldNames.add("col1");
        stringOI = (PrimitiveObjectInspector) arg0[0];
       listOi=(ListObjectInspector) arg0[0];
        fieldOIs.add(listOi.getListElementObjectInspector());
        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
}

@Override
public void process(Object[] record) throws HiveException {
    // TODO Auto-generated method stub
     String document = (String) stringOI.getPrimitiveJavaObject(record[0]);
     if (document == null) {
          return;
        }
    firstColumn=(String) stringOI.getPrimitiveJavaObject(record[0]);
    secondColumn=(String) stringOI.getPrimitiveJavaObject(record[1]);
    if(outputMapper.containsKey(firstColumn))
    {

        ArrayList<String> tempList=new ArrayList<String>();
        tempList=outputMapper.get(firstColumn);
        tempList.add(secondColumn);
        outputMapper.put(firstColumn,tempList);
    }
    else
    {
            childVendorList=new ArrayList<String>();
            childVendorList.add(secondColumn);
            outputMapper.put(firstColumn,childVendorList);
    }
    forward(outputMapper.get(firstColumn));

}

}

我得到了以下异常:

无法将org.apache.hadoop.hive.serde2.lazy.objectinspector.primitive.LazyStringObjectInspector强制转换为org.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector的java.lang.ClassCastException

有人能帮上忙吗?

EN

回答 1

Stack Overflow用户

发布于 2015-02-01 21:57:10

代码语言:javascript
复制
listOi=(ListObjectInspector) arg0[0];
fieldOIs.add(listOi.getListElementObjectInspector());
return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);

这个arg0是一个基本的对象检查器。使用listOi.getListElementObjectInspector(),只需得到一个类似的PrimitiveObjectInspector(就像String一样,Integer不是一个列表)。它应该是

代码语言:javascript
复制
fieldOIs.add(ObjectInspectorFactory.getStandardListObjectInspector(stringOI ))

这将使用stringOI类型的列表指定输出列。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27539923

复制
相关文章

相似问题

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