Hive UDF — исключение приведения строки Java

Я написал UDF, который декодирует cookie и возвращает список строк. К сожалению, я получил ошибку Hive Runtime во время обработки

вот мой код:

@Override
public ObjectInspector initialize(ObjectInspector[] input) throws UDFArgumentException {

    ObjectInspector cookieContent = input[0];
    if (!(isStringOI(cookieContent))){
        throw new UDFArgumentException("only string");
    }
    this.cookieValue = (StringObjectInspector) cookieContent;
    return ObjectInspectorFactory.getStandardListObjectInspector
            (PrimitiveObjectInspectorFactory.javaStringObjectInspector);
}


public Object evaluate(DeferredObject[] input) throws HiveException {

    String encoded = cookieValue.getPrimitiveJavaObject(input[0].get());
    try {
        result = decode(encoded);
    } catch (CodeException e) {
        throw new UDFArgumentException();
    }

    return result;
}
public List<String> decode(String encoded) throws CodeException {

    decodedBase64 = Base64.decodeBase64(encoded);
    String decompressedArray = new String(getKadrs(decodedBase64));
    String kadr= decompressedArray.substring(decompressedArray.indexOf("|") + 1);
    List<String> kadrsList= new ArrayList(Arrays.asList(kadr.split(",")));
    return kadrsList;
}

private byte[] getKadrs(byte[] compressed) throws CodeException {
    Inflater decompressor = new Inflater();
    decompressor.setInput(compressed);
    ByteArrayOutputStream outPutStream = new ByteArrayOutputStream(compressed.length);
    byte temp [] = new byte[1024];
    while (!decompressor.finished()) {
        try {
            int count = decompressor.inflate(temp);
            outPutStream.write(temp, 0, count);
        }
        catch (DataFormatException e) {
            throw new CodeException ("Wrong data format", e);
        }
    }
    try {
        outPutStream.close();
    } catch (IOException e) {
        throw new CodeException ("Cant close outPutStream ", e);
    }
    return outPutStream.toByteArray();
}

Результатом этого является, скажем:

"кадр1, кадр20, кадр35, кадр12". Модульные тесты работают нормально, но когда я пытаюсь использовать эту функцию в улье, я получаю следующее:

   Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to org.apache.hadoop.io.Text
  at org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableStringObjectInspector.getPrimitiveWritableObject(WritableStringObjectInspector.java:41)

Мне трудно отлаживать, потому что другой человек должен реализовать мою банку, чтобы увидеть результаты, поэтому все советы будут оценены.


person rzeznik    schedule 01.11.2015    source источник
comment
Я подозреваю, что input[0].get() возвращает Text, и вы пытаетесь привести к String   -  person Ravindra babu    schedule 01.11.2015
comment
@ravindra - я думаю, у вас это наоборот, потому что ошибка говорит, что нельзя преобразовать в текст.   -  person OneCricketeer    schedule 01.11.2015
comment
Да. Ты прав. Это моя ошибка.   -  person Ravindra babu    schedule 01.11.2015


Ответы (2)


Равиндра был прав

я должен был в initialize
вернуть ObjectInspectorFactory.getStandardListObjectInspector (PrimitiveObjectInspectorFactory.writableStringObjectInspector);

и WritableStringObjectInspector возвращает текст

я изменил его на javaStringObjectInspector, который возвращает строку, и все в порядке, спасибо

person rzeznik    schedule 03.11.2015

Ваш метод evaluate в настоящее время возвращает String, который не является типом данных Hadoop. Вместо этого вы должны обернуть свою строку в объект Text, сказав return new Text(result).

person OneCricketeer    schedule 01.11.2015