向 udf pig latin 发送矩阵

Posted

技术标签:

【中文标题】向 udf pig latin 发送矩阵【英文标题】:sending a matrix to udf pig latin 【发布时间】:2013-09-24 13:31:51 【问题描述】:

我对 UDF pig latin 有疑问。 我正在尝试实现一个系统,该系统必须验证存储在本地的矩阵和存储在 hadoop 存储库中的一组矩阵之间是否存在“映射”。 对于映射,我的意思是如果在 hadoop 中存在一个存储矩阵的行和列的排列,它将矩阵中的矩阵转换为等于本地存储的矩阵。 因为矩阵可以有数百个元素,所以我想在 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);

考虑在 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】:

您可以像在 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 上,以便正在初始化并调用构造函数的映射器或化简器可以访问数据。

【讨论】:

谢谢你的回答,我很感激。因此,如果我理解,您建议: 1) 将本地矩阵存储在 hdfs 2) 定义映射 myudfs.Mapping('/path/to/matrix/on/HDFS'); 3) pigServer.registerJar("/Users/myudfs.jar"); 4)pigServer.registerQuery("records = LOAD 'Sample7.txt';"); 我错过了关于如何通过 Java 调用它的部分。在那种情况下,我不确定DEFINE 语句是否会像往常一样工作。不过试试看吧。

以上是关于向 udf pig latin 发送矩阵的主要内容,如果未能解决你的问题,请参考以下文章

Pig UDF 或 Pig Latin 还是两者兼而有之?

Pig Latin 中的用户定义函数

Hive UDF:Hive 没有向 UDF 发送正确的参数

Pig UDF 似乎总是在单个减速器中运行 - PARALLEL 不起作用

Pig 多个存储命令创建重复工作

如何从Spark数据帧中的When子句向udf发送多个列?