我试图在初始化方法中读取一个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
}
}
答案 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");
}
}
}
要测试代码:
在配置单元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结果。