-1

我正在尝试在初始化方法中读取配置单元 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 
    }
}
4

2 回答 2

1

回答这个问题可能为时已晚,但对于其他人来说,下面是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';
    
于 2018-09-28T16:16:30.740 回答
-1

我也在使用自定义 UDTF 时遇到了这个问题。在 MapredContext.get() 方法返回非空结果之前,似乎不会在用户定义的函数上调用 configure() 方法(例如,参见 UDTFOperator 第 82 行)。MapredContext.get() 可能返回 null 结果,因为 hive 作业尚未启动映射器/缩减器(您可以看到 MapredContext.get() 将返回 null 直到 MapredContext.init() 方法被调用; init() 方法将 boolean isMap 作为参数,因此直到 MR/Tez 运行时才会调用此方法 -与 GenericUDTF.configure() 方法相关的注释证实了这一点)。

TLDR UDF/UDTF initialize() 方法将在作业设置期间调用,而 configure() 将在 MR 运行时调用,因此示例代码中的结果为空。

于 2016-11-29T23:21:00.617 回答