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



我正在尝试在初始化方法中读取一个 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");
            }
        }
    }

要测试代码:

  1. 构建 UDF 罐
  2. 在 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 结果。

相关内容

  • 没有找到相关文章

最新更新