Возвращаемый массив Hive GenericUDF‹String› Ошибка

Я новичок в GenericUDF. Я пытаюсь создать функцию для создания телефонных номеров с использованием Array<strings>.

Но у меня ОШИБКА:

Вызвано: java.lang.ClassCastException: org.apache.hadoop.hive.serde2.lazy.LazyString нельзя преобразовать в java.lang.String

В этой строке:

String inumber = (String) listOi.getListElement(args[1].get(), i);

Кто-нибудь может мне помочь, пожалуйста? Спасибо.

Это мой код:

@Description(name = "create_numbers",
value = "_FUNCT_(prefix, array(number1, number2, ...)); first argument is a prefix(string) and the second argument is a array of strings."
        + "Return a list of phone numbers. "
        + "Example: prefix = +49 and arrayNumbers = Array[1234, 2346, 1356] - Result: Array[+491234, +492346, +491356].")

public class UDFGenericListNumbers extends GenericUDF {
ListObjectInspector     listOi;
StringObjectInspector   elemOi;

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

    // we must have 2 arguments
    if(args==null || args.length != 2) {
            throw new HiveException("received " + (args == null? "null" :
            Integer.toString(args.length) + " elements instead of 2"));
    }

    String prefix = elemOi.getPrimitiveJavaObject(args[0].get());

    //if any of them null, return also null
    if(args[0] == null || args[1] == null){
        return null;
    }

    List<String> resultlnumerbs = new ArrayList<String>();      
    int numElem = listOi.getListLength(args[1].get());

    for(int i=0; i<numElem; i++){           
        String inumber = (String) listOi.getListElement(args[1].get(), i);          
        resultlnumerbs.add(prefix + inumber);       
    }             
    return resultlnumerbs;
}

public ObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException {

    // check number of arguments. We only accept two
    if (args.length != 2) {
          throw new UDFArgumentLengthException("Two arguments are needed: String and List<String>, found "+ args.length);
    }

    //Check we received the right objects types.
    if (!(args[0] instanceof StringObjectInspector) || !(args[1] instanceof ListObjectInspector)) {
      throw new UDFArgumentException("first argument must be a string and the second argument must be a list / array of string");
    }

    this.elemOi = (StringObjectInspector) args[0];
    this.listOi = (ListObjectInspector) args[1];

    //Check that the list contains strings
    if(!(listOi.getListElementObjectInspector() instanceof StringObjectInspector)) {
      throw new UDFArgumentException("second argument must be a list of strings");
    }

    // the return type of our function is an array of string, so we provide the correct object inspector        
    return (StringObjectInspector)listOi.getListElementObjectInspector();
}

@Override
public String getDisplayString(String[] arg0) {
    return "create_numbers";
}

}

person ChAkO    schedule 08.07.2015    source источник


Ответы (3)


Вместо

String inumber = (String) listOi.getListElement(args[1].get(), i); 

пытаться

String inumber =  listOi.getListElement(args[1].get(), i).toString();

Поскольку getListElement() возвращает объект, его можно использовать.

person Garry    schedule 08.07.2015
comment
Спасибо за ответ, но ошибка сохраняется. Вызвано: java.lang.ClassCastException: java.util.ArrayList не может быть приведен к org.apache.hadoop.hive.serde2.lazy.LazyString в org.apache.hadoop.hive.serde2.lazy .objectspector.primitive.LazyStringObjectInspector.getPrimitiveWritableObject(LazyStringObjectInspector.java:51) - person ChAkO; 08.07.2015

пытаться

String inumber =  ((org.apache.hadoop.hive.serde2.lazy.LazyString) listOi.getListElement(args[1].get(), i)).getObject().toString();
person Ezequiel    schedule 08.07.2015
comment
спасибо .. но ошибка продолжается: вызвано: java.lang.ClassCastException: java.util.ArrayList не может быть приведен к org.apache.hadoop.hive.serde2.lazy.LazyString в org.apache.hadoop.hive.serde2. lazy.objectspector.primitive.LazyStringObjectInspector.getPrimitiveWritableObject(LazyStringObjectInspector.java:51) - person ChAkO; 08.07.2015

Это немного поздно, но это может решить попытку один раз.

используйте приведенный ниже код в цикле:

public Object evaluate(DeferredObject[] args) throws HiveException { ... ... for(int i=0; i<numElem; i++){
LazyString inumber = (LazyString) listOi.getListElement(args[1].get(), i); String inumberLS = elemOi.get(inumber); resultlnumerbs.add(prefix + inumberLS); return resultlnumerbs; }

Тип возвращаемого значения при использовании метода инициализации

public ObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException { ... ... return ObjectInspectorFactory.getStandardListObjectInspector(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
}

person Arun Maity    schedule 22.01.2017