Как получить имя поля инспектора примитивного объекта в Java - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь решить эту проблему для UDF, который я создаю для среды hiveql.

public ObjectInspector initialize(ObjectInspector[] arguments)
            throws UDFArgumentException {
    if (arguments.length != 1) {
        throw new UDFArgumentException("Usage : multiple_prop(primitive var) ");
    }
    // This will be an string
    moi = (PrimitiveObjectInspector) arguments[0];

    ArrayList structFieldNames = new ArrayList();
    ArrayList structFieldObjectInspectors = new ArrayList();

    structFieldNames.add("fields name"); <-- Issue is here

Как я могу сделать, чтобы получить имя поля там?Это может быть легко сделано для structObjectInspectors, но как нам справиться с этим в PrimitiveObjectInspectors?

Полный код будет таким

public class prop_step2 extends GenericUDF {
    private PrimitiveObjectInspector moi;
    @Override
    public ObjectInspector initialize(ObjectInspector[] arguments)
            throws UDFArgumentException {
        if (arguments.length != 1) {
            throw new UDFArgumentException("Usage : multiple_prop(primitive var) ");
        }
        // This will be an string
        moi = (PrimitiveObjectInspector) arguments[0];

        ArrayList structFieldNames = new ArrayList();
        ArrayList structFieldObjectInspectors = new ArrayList();
        // Change this to get the input variable name, and not the type name
        structFieldNames.add(moi.getTypeName());<-- Change this to field name
        structFieldObjectInspectors.add( PrimitiveObjectInspectorFactory.writableStringObjectInspector );

       return ObjectInspectorFactory.getStandardStructObjectInspector(structFieldNames, structFieldObjectInspectors);
    }

    @Override
    public Object evaluate(DeferredObject[] arguments) throws HiveException {
        Object[] result;
        result = new Object[1];
        Text elem1 = new Text((String) moi.getPrimitiveJavaObject(arguments[0].get()));
        result[0]= elem1;
        return result;
    }
    @Override
    public String getDisplayString(String[] children) {
        return "stop";
    }}

Когда это будет закончено, я быхотел бы назвать этот udf из улья:

CREATE TEMPORARY FUNCTION step AS 'UDFpack.prop_step2';
select 
step(bit) as sd
from my_table

И я ожидал бы, что если при верхнем выборе я сделаю это: sd.bit, я получу значение 'bit'.

1 Ответ

0 голосов
/ 03 декабря 2018

Это просто невозможно. Информация, передаваемая в UDF - ObjectInspectors - не содержит их имени. Вот почему вы можете видеть, как имена выходных столбцов изменяются на _col0, _col1 .. на промежуточных этапах плана объяснения Hive. Я также весьма раздражен этим и думаю, что это упущение со стороны Hive.

Обходной путь - поместить ваш вклад в структуру и разобрать его.

То есть шаг (named_struct ('bit', bit)), а затем вы можете получить имя поля структуры в вашем UDF. Но это не так приятно

...