0

UDF ピッグ ラテン語に問題があります。ローカルに保存されているマトリックスと Hadoop リポジトリに保存されている一連のマトリックスの間に「マッピング」があるかどうかを確認する必要があるシステムを実装しようとしています。マッピングの場合、hadoop に格納された 1 つの行列の行と列の順列が存在し、ローカルに格納されている行列と等しい行列に行列を変換することを意味します。行列には数百の要素が含まれる可能性があるため、並列処理を使用するために Hadoop でマッピング アルゴリズムを実行することを考えていました。UDF pig latin を探していましたが、ローカル マトリックスを UDF 関数に「送信」する方法がわかりません。

public class Mapping extends EvalFunc<String>
 {
private int[][] matrixToMap; //The local matrix i want to map

public String exec(Tuple input) throws IOException { //Here the tuple are the matrix stored in hadoop
  if (input == null || input.size() == 0)
      return null;
  try{
       //HERE THE CODE FOR THE MAPPING
  }

     }
   }

}

私が抱えている問題は、このコードを使用することを考慮して属性 matrixToMap を初期化する方法です:

REGISTER /Users/myudfs.jar;  
//SOME CODE TO INITIALIZE ATTRIBUTE matrixToMap
records = LOAD 'Sample7.txt' //the matrix stored in hadoop
B = FOREACH records GENERATE myudfs.mapping(records);

pig スクリプトが Java プログラムで呼び出され、ローカル マトリックスが Java マトリックスに格納されているとします。したがって、Java プログラムは次のようになります。

int [][] localMatrix;
pigServer.registerJar("/Users/myudfs.jar");
//Some code to make Mapping.matrixToMap = localMatrix
pigServer.registerQuery("records = LOAD 'Sample7.txt';");
pigServer.registerQuery("B = FOREACH records GENERATE myudfs.Mapping(formula);"); 

何か考えはありますか?ありがとう

4

1 に答える 1

0

UDF のコンストラクターで、次のようにクラス変数を初期化できます。

public class Mapping extends EvalFunc<String>
{
  private int[][] matrixToMap; //The local matrix i want to map

  public Mapping(String filename) {
    // Code to populate matrixToMap from the data in filename
  }

  public String exec(Tuple input) throws IOException { //Here the tuple are the matrix stored in hadoop
    if (input == null || input.size() == 0)
      return null;
    try{
       //HERE THE CODE FOR THE MAPPING
    }

   }
 }

スクリプトで、次の行を使用します。

DEFINE Mapping myudfs.Mapping('/path/to/matrix/on/HDFS');

この方法では、初期化されてコンストラクターを呼び出すマッパーまたはリデューサーがデータにアクセスできるように、マトリックスを HDFS に格納する必要があります。

于 2013-09-24T14:10:26.323 に答える