向udf pig latin发送矩阵

时间:2013-09-24 13:31:52

标签: hadoop matrix user-defined-functions apache-pig

我对UDF猪拉丁有问题。 我正在尝试实现一个系统,该系统必须验证存储在本地的矩阵和存储在hadoop存储库中的一组矩阵之间是否存在“映射”。 对于映射,我的意思是如果在hadoop中存在一个存储矩阵的行和列的排列,该矩阵将矩阵变换为等于存储在本地中的矩阵。 因为矩阵可以有数百个元素,所以我想在hadoop上执行映射算法以使用并行性。 我正在寻找UDF猪拉丁语,但我不明白如何将本地矩阵“发送”到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);

考虑在java程序中调用pig脚本,并且本地矩阵存储在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);"); 
你知道吗? 谢谢

1 个答案:

答案 0 :(得分: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上,以便初始化并调用构造函数的映射器或缩减器可以访问数据。