0

プロパティファイルで定義された値に従ってマップ内のキーと値のペアを解析するカスタムHiveUDFを作成しています。検証中の形式(Map <String、String>、String)。最初の引数を評価するマップにし、2番目の引数をプロパティファイルを含めることを目的としています。

私が抱えている問題は、initialize()関数がObjectInspectorsとして引数をキャストするため、GenericUDFクラスは、これらの値の両方がクエリに対して動的であることを期待しているように見えることです。彼らは検査しています。

初期化関数でプロパティファイルをロードし、evaluate関数で合格/不合格を返すようにします。これは私が試したすべてをカバーするのにほぼ十分なコードではありませんが、うまくいけば、彼らが問題について良い考えをしていることを知っている誰かにそれを与えるでしょう:

public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
  mapOI = (MapObjectInspector) arguments[0];
  StringObjectInspector stringOI = (StringObjectInspector) arguments[1];

  try {
    // Begin Debug
    System.out.println(stringOI.getPrimitiveJavaObject(((DeferredObject) arguments[1]).get()));
    // End Debug

    loadProperties(stringOI.getPrimitiveJavaObject(((DeferredObject) arguments[1]).get()));
  }
  catch (HiveException exception) {
    throw new UDFArgumentTypeException(1, "Failed to cast properties file path for evaluation by loadProperties... What did you do?");
  }
4

1 に答える 1

2

initializeメソッドは1回だけ呼び出されるため、パラメーターは、evaluateメソッドが受け取ることを期待する入力タイプを説明するメタデータとのみ見なすことができます。したがって、実際に入力値を確認できるのは、evaluateメソッド内だけです。このメソッドは、複数回、通常は1行に1回呼び出される可能性があります。実際には、初期化関数を使用して、実際の値ではなく型を検証する必要があります。つまり、あなたの場合、入力が文字列型のプリミティブカテゴリ要素を持つマップ型であることを確認してください。実際の値の検証は、evaluateメソッドで実行する必要があります。

于 2012-10-12T19:39:18.767 に答える