Java 配置单元UDTF返回ArrayList列

Java 配置单元UDTF返回ArrayList列,java,hadoop,arraylist,hive,Java,Hadoop,Arraylist,Hive,我是新来的蜂巢UDTF。我有一个要求,我必须在UDTF中将字符串值作为parameter传递,并且返回的列应该是ArrayList 我编写了以下代码: public StructObjectInspector initialize(ObjectInspector[] arg0) throws UDFArgumentException { ArrayList<String> fieldNames = new ArrayList<String>

我是新来的蜂巢UDTF。我有一个要求,我必须在UDTF中将字符串值作为parameter传递,并且返回的列应该是ArrayList

我编写了以下代码:

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));

}
公共结构ObjectInspector初始化(ObjectInspector[]arg0)
抛出UDFArgumentException{
ArrayList fieldNames=新的ArrayList();
ArrayList fieldOIs=新的ArrayList();
字段名。添加(“col1”);
stringOI=(原始ObjectInspector)arg0[0];
listOi=(ListObjectInspector)arg0[0];
add(listOi.getListElementObjectInspector());
返回ObjectInspectorFactory.getStandardStructObjectInspector(字段名、字段OIS);
}
@凌驾
公共作废进程(对象[]记录)引发HiveException{
//TODO自动生成的方法存根
字符串文档=(字符串)stringOI.getPrimitiveJavaObject(记录[0]);
if(document==null){
返回;
}
firstColumn=(String)stringOI.getPrimitiveJavaObject(记录[0]);
secondColumn=(字符串)stringOI.getPrimitiveJavaObject(记录[1]);
if(outputMapper.containsKey(第一列))
{
ArrayList tempList=新的ArrayList();
templast=outputMapper.get(第一列);
添加(第二列);
put(第一列,圣殿骑士);
}
其他的
{
childVendorList=newArrayList();
添加(第二列);
outputMapper.put(第一列,childVendorList);
}
转发(outputMapper.get(firstColumn));
}
}

我得到以下例外情况:

java.lang.ClassCastException:org.apache.hadoop.hive.serde2.lazy.objectinspector.primitive.LazyStringObjectInspector不能强制转换为org.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector

有人能帮忙吗

listOi=(ListObjectInspector) arg0[0];
fieldOIs.add(listOi.getListElementObjectInspector());
return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
此arg0[0]是一个基本对象检查器。使用listOi.getListElementObjectInspector(),只需获取一个类似的PrimitiveObjectInspector(与字符串类似,Integer不是列表)。它应该

fieldOIs.add(ObjectInspectorFactory.getStandardListObjectInspector(stringOI ))

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

非常感谢!它现在正在工作!!好的,同样的意思,你能为我点击有用的按钮作为奖励吗