如何在udf initialize方法中读取配置单元conf变量

r6hnlfcb  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(325)

我试图读取初始化方法中的配置单元conf变量,但不起作用,有什么建议吗?
我的自定义项类:

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 
    }
}
bkkx9g8r

bkkx9g8r1#

回答这个问题可能为时已晚,但对其他人来说,下面的答案是一个简单的答案 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);
    }
}

代码在hive1.2上进行了测试
您还应该覆盖 configure 支持的方法 MapReduce ```
@Override
public void configure(MapredContext context) {
...................
........................
JobConf conf = context.getJobConf();
if (conf != null) {
String myhiveConf = conf.get("temp_var");
}
}
}

要测试代码:
构建自定义项jar
在hive 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';

pvabu6sv

pvabu6sv2#

我还遇到了一个自定义udtf的问题。在mapredcontext.get()方法返回非空结果之前,似乎不会对用户定义的函数调用configure()方法(例如,请参见udtfoperator第82行)。mapredcontext.get()可能返回null结果,因为配置单元作业尚未启动Map器/还原器(可以看到mapredcontext.get()将返回null,直到调用mapredcontext.init()方法为止;init()方法将boolean ismap作为参数,因此直到mr/tez运行时(与genericudtf.configure()方法相关联的注解证实了这一点)才会调用此方法。
tldr在作业设置期间将调用udf/udtf initialize()方法,在mr运行时将调用configure(),因此示例代码中的结果为空。

相关问题