我正在尝试在初始化方法中读取一个 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
}
}
回答这个问题可能为时已晚,但对于其他人来说,下面是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);
}
}
代码在 hive 1.2 上进行测试
还应重写configure
方法以支持MapReduce
@Override
public void configure(MapredContext context) {
...................
........................
JobConf conf = context.getJobConf();
if (conf != null) {
String myhiveConf = conf.get("temp_var");
}
}
}
要测试代码:
- 构建 UDF 罐 子
在 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';
我在使用自定义 UDTF 时也遇到了这个问题。似乎在 MapredContext.get() 方法返回非空结果之前,不会在用户定义的函数上调用 configure() 方法(例如,请参阅 UDTFOperator 第 82 行)。MapredContext.get() 可能会返回一个空结果,因为 hive 作业尚未启动映射器/化简器(你可以看到 MapredContext.get() 将返回空值,直到调用 MapredContext.init() 方法;init() 方法将布尔 isMap 作为参数,因此直到 MR/Tez 运行时才会调用此方法 - 与 GenericUDTF.configure() 方法关联的注释证实了这一点)。
TLDR UDF/UDTF initialize() 方法将在作业设置期间调用,configure() 将在 MR 运行时调用,因此示例代码中的 null 结果。