Как читать переменные hive conf в методе инициализации UDF

Я пытаюсь прочитать переменную hive conf в методе initialize, но не работает, любое предложение, плз?

Мой класс UDF:

public class MyUDF extends GenericUDTF {
    MapredContext _mapredContext;

    @Override
    public void configure(MapredContext mapredContext) {
      _mapredContext = mapredContext;
      super.configure(mapredContext);
    }

    @Override
    public StructObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException {
      Configuration conf = _mapredContext.getJobConf();
    // i am getting conf as null 
    }
}

2 ответа

Возможно, уже слишком поздно, чтобы ответить на этот вопрос, но для других ниже ответ внутри GenericUDF evaluate() метод:

@Override
public Object evaluate(DeferredObject[] args) throws HiveException {
    String myconf;
    SessionState ss = SessionState.get();
    if (ss != null) {
        HiveConf conf = ss.getConf();
        myconf= conf.get("my.hive.conf");
        System.out.println("sysout.myconf:"+ myconf);
    }
}

Код проверен на улье 1.2

Вы также должны переопределить configure метод поддержки MapReduce

@Override
    public void configure(MapredContext context) {
        ...................
        ........................
        JobConf conf = context.getJobConf();
            if (conf != null) {
              String myhiveConf = conf.get("temp_var");
            }
        }
    }

Чтобы проверить код:

  1. Построить UDF Jar
  2. В интерфейсе командной строки выполните следующие команды:

    SET hive.root.logger=INFO,console;
    SET my.hive.conf=test;
    ADD JAR /path/to/the/udf/jar;
    CREATE TEMPORARY FUNCTION test_udf AS com.example.my.udf.class.qualified.classname';
    

Я также столкнулся с этой проблемой с пользовательским UDTF. Похоже, что метод configure() не вызывается для пользовательской функции, пока метод MapredContext.get() не вернет ненулевой результат (см., Например, строку 82 UDTFOperator). MapredContext.get(), скорее всего, возвращает нулевой результат, потому что задание куста еще не раскрутило мапперы / редукторы ( вы можете видеть, что MapredContext.get() будет возвращать ноль до тех пор, пока не будет вызван метод MapredContext.init (); Метод init () принимает в качестве параметра логический isMap, поэтому этот метод вызывается только во время выполнения MR/Tez - комментарий, связанный с методом GenericUDTF.configure(), подтверждает это).

TLDR метод initialize () UDF/UDTF будет вызван во время настройки задания, а configure() будет вызван во время выполнения MR, поэтому в вашем примере кода будет нулевой результат.

Другие вопросы по тегам