我试图读取初始化方法中的配置单元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
}
}
2条答案
按热度按时间bkkx9g8r1#
回答这个问题可能为时已晚,但对其他人来说,下面的答案是一个简单的答案
GenericUDF evaluate()
方法:代码在hive1.2上进行了测试
您还应该覆盖
configure
支持的方法MapReduce
```@Override
public void configure(MapredContext context) {
...................
........................
JobConf conf = context.getJobConf();
if (conf != null) {
String myhiveConf = conf.get("temp_var");
}
}
}
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';
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(),因此示例代码中的结果为空。