-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);
    }
}

コードはハイブ 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 Jar のビルド
  2. ハイブ 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() メソッドが null 以外の結果を返すまで、configure() メソッドはユーザー定義関数で呼び出されないようです (たとえば、UDTFOperator 行 82 を参照)。MapredContext.get() は、ハイブ ジョブがまだマッパー/リデューサーを起動していないため、null の結果を返す可能性があります ( MapredContext.get() は、MapredContext.init() メソッドが呼び出されるまで null を返すことがわかります。 init() メソッドは boolean isMap をパラメーターとして受け取るため、このメソッドは MR/Tez ランタイムまで呼び出されません(GenericUDTF.configure() メソッドに関連付けられたコメントで確認できます)。

TLDR UDF/UDTF initialize() メソッドはジョブのセットアップ中に呼び出され、configure() は MR 実行時に呼び出されるため、サンプル コードでは null の結果になります。

于 2016-11-29T23:21:00.617 に答える