java - Hive UDTF 返回 ArrayList 列

标签 java hadoop arraylist hive

我是 Hive UDTF 新手。我有一个要求,必须在 UDTF 中将字符串值作为参数传递,并且返回的列应该是 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));

}

}

我收到以下异常:

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(如String,Integer不是List)。应该是这样的

fieldOIs.add(ObjectInspectorFactory.getStandardListObjectInspector(stringOI ))

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

关于java - Hive UDTF 返回 ArrayList 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27539923/

相关文章:

java - JUnit 中的参数化测试方法,而不仅仅是整个类

python - mrjob:在 EMR 上设置日志记录

sql - 选择列中特定 ID 和列表名称价格高于同一列的行?

java - 将 SQL-INSERT 拆分为 Map 列名称 > 值

java - 在函数中创建不同类类型的实例

hadoop - 如何在 hive udf 中传递 Hive conf 变量?

java - 使用 getter 从 ArrayList 中获取对象

java - 在类中委托(delegate) ArrayList

java - java中如何将ArrayList转成String[],Arraylist包含VO对象

java - 使用数据库开发 Java 应用程序