如何在UDF初始化方法中读取hive conf变量

时间:2016-02-29 08:16:38

标签: hive hive-udf

我试图在初始化方法中读取一个hive conf变量,但不起作用,有什么建议吗?

我的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 个答案:

答案 0 :(得分:0)

回答这个问题可能为时已晚,但对于下面的其他问题,是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. 在配置单元CLI上,执行以下命令:

    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';
    

答案 1 :(得分:-1)

我也遇到了使用自定义UDTF的问题。似乎在用户定义的函数上没有调用configure()方法,直到MapredContext.get()方法返回非null结果(参见UDTFOperator line 82 for example)。 MapredContext.get()可能返回null结果,因为hive作业尚未启动mappers / reducers(you can see that MapredContext.get() will return null up until the MapredContext.init() method has been called; init()方法将boolean isMap作为参数,因此不会调用此方法直到MR / Tez运行时 - the comment associated with the GenericUDTF.configure() method confirms this)。

TLDR UDF / UDTF initialize()方法将在作业设置期间调用,并且configure()将在MR运行时调用,因此示例代码中为null结果。