Hive generi c UDTF завершается с ошибкой индекса массива - PullRequest
0 голосов
/ 18 апреля 2020

Это касается Hive generi c UDTF.

Целью программы является получение одного строкового столбца в качестве входных и выходных данных в несколько строк после разделения входного столбца (строки) на пробел. Сгенерировал файл jar и добавил jar в оболочку куста, а также создал временную функцию для имени класса. при вызове функции gtting индекс массива из связанной ошибки.

код:

package com.suba.customHiveUdfs;

import java.util.ArrayList;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
public class MyUdtf extends GenericUDTF {
    ArrayList<String> colList = new ArrayList<>(1);
    ArrayList<ObjectInspector> oiList = new ArrayList<>(1);
    PrimitiveObjectInspector poi = null;
    @Override
    public StructObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
        // TODO Auto-generated method stub
        if (argOIs.length > 1) {
            throw new UDFArgumentException("invalid argument");
        }
        if (argOIs[0].getCategory() != ObjectInspector.Category.PRIMITIVE) {
            throw new UDFArgumentException("primitive expected");
        }
        if (((PrimitiveObjectInspector) argOIs[0])
                .getPrimitiveCategory() != PrimitiveObjectInspector.PrimitiveCategory.STRING) {
            throw new UDFArgumentException("not string type");
        }
        poi = (PrimitiveObjectInspector) argOIs[0];
        colList.add("name");
        oiList.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        return ObjectInspectorFactory.getStandardStructObjectInspector(colList, oiList);
    }
    @Override
    public void process(Object[] arg0) throws HiveException {
        String name = ((PrimitiveObjectInspector) poi).getPrimitiveJavaObject(arg0[0]).toString();
        String[] tokens = name.split(" ");
        for (String x : tokens) {
            Object[] objects = new Object[] { x };
            forward(objects);
        }
    }
    @Override
    public void close() throws HiveException {
    }
}

Показанное ниже сообщение об ошибке: Получение индекса массива из связанной ошибки.

Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
    at java.util.Arrays$ArrayList.get(Arrays.java:3841)
    at org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.serialize(LazySimpleSerDe.java:417)
    at org.apache.hadoop.hive.ql.exec.FileSinkOperator.processOp(FileSinkOperator.java:592)
    at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:796)
    at org.apache.hadoop.hive.ql.exec.UDTFOperator.forwardUDTFOutput(UDTFOperator.java:125)
    at org.apache.hadoop.hive.ql.udf.generic.UDTFCollector.collect(UDTFCollector.java:45)
    at org.apache.hadoop.hive.ql.udf.generic.GenericUDTF.forward(GenericUDTF.java:107)
    at com.suba.customHiveUdfs.MyUdtf.process(MyUdtf.java:61)
    at org.apache.hadoop.hive.ql.exec.UDTFOperator.processOp(UDTFOperator.java:108)
    at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:796)
    at org.apache.hadoop.hive.ql.exec.SelectOperator.processOp(SelectOperator.java:87)
    at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:796)
    at org.apache.hadoop.hive.ql.exec.TableScanOperator.processOp(TableScanOperator.java:92)
    at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:796)
    at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:539)
    ... 9 more

1 Ответ

0 голосов
/ 27 апреля 2020

Проблема устранена после изменения или l oop внутри метода процесса как ..

    for (String x : tokens) {
        String string[] = new String[] { x };

        forward(string);
    }
...