【问题标题】:Can I pass parameters to UDFs in Pig script?我可以在 Pig 脚本中将参数传递给 UDF 吗?
【发布时间】:2012-10-31 17:38:04
【问题描述】:

我对 PigScript 比较陌生。我想知道是否有一种方法可以将参数传递给 Pig 中的 Java UDF?

这是场景: 我有一个日志文件,它有不同的列(每个代表另一个表中的主键)。我的任务是获取所选列中不同主键值的计数。 我编写了一个 Pig 脚本,它可以获取不同的主键并计算它们。 但是,我现在应该为每一列编写一个新的 UDF。有一个更好的方法吗?就像我可以将行号作为参数传递给 UDF 一样,它避免了我编写多个 UDF 的需要。

【问题讨论】:

    标签: apache-pig


    【解决方案1】:

    方法是使用DEFINE 和UDF 的构造函数。所以这里是一个客户“拆分器”的例子:

    REGISTER com.sample.MyUDFs.jar;
    DEFINE CommaSplitter com.sample.MySplitter(',');
    
    B = FOREACH A GENERATE f1, CommaSplitter(f2);
    

    希望能传达这个想法。

    【讨论】:

      【解决方案2】:

      要传递参数,请在 pigscript 中执行以下操作:

      UDF(document, '$param1', '$param2', '$param3')
      

      编辑:不确定这些参数是否需要包装在“”中

      在你的 UDF 中你这样做:

      public class UDF extends EvalFunc<Boolean> {
      
      
      
      public Boolean exec(Tuple input) throws IOException {
      
          if (input == null || input.size() == 0)
              return false;
      
          FileSystem fs = FileSystem.get(UDFContext.getUDFContext().getJobConf());
      
      
          String var1 = input.get(1).toString();
          InputStream var1In = fs.open(new Path(var1));
      
      
          String var2 = input.get(2).toString();
          InputStream var2In = fs.open(new Path(var2));
      
          String var3 = input.get(3).toString();
          InputStream var3In = fs.open(new Path(var3));
      
      
      
          return doyourthing(input.get(0).toString());
      }
      }
      

      例如

      【讨论】:

        【解决方案3】:

        是的,您可以在 UDF 的 Tuple 参数输入中传递任何参数:

        exec(Tuple input)
        

        并使用它访问它

        input.get(index)
        

        【讨论】:

        • 是的,弗雷德。但是如何从 PigScript 端传递参数?
        • 我不知道这是否正是您想要做的,但您可以创建一个新的元组,其中主键作为第一个字段,您实际想要传递给 UDF 的数据作为剩余字段:FOREACH tupleForUdf GENERATE primarykey, *;
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-12
        • 1970-01-01
        • 2013-06-11
        • 2012-09-07
        • 1970-01-01
        • 2017-07-27
        • 1970-01-01
        相关资源
        最近更新 更多