在 Pig 中只执行一次 UDF

Posted

技术标签:

【中文标题】在 Pig 中只执行一次 UDF【英文标题】:Executing a UDF in Pig only once 【发布时间】:2014-02-25 20:25:26 【问题描述】:

我已经看到这个问题,但我还没有看到答案..

是否可以一次从 pig 调用 UDF?

我基本上希望通过对 java UDF 的一次调用来处理我存储的文本文件的转换。转换的内部在Java中更容易处理,开销很小,所以我宁愿不将逻辑转换为pig..

我成功调用 UDF 的唯一方法是在某些数据集上作为 FOREACH 语句的一部分。我认为我可以创建一个大小为 1 的虚拟元组,然后将其用作“foreach”的一部分,但我也无法弄清楚创建这个虚拟元组的语法..

UDF 不需要返回任何内容,它会处理 FS 逻辑本身,我只想能够从 pig 脚本中执行它,因为在此处检测它更有意义,然后作为更大工作流程的一部分..

任何帮助将不胜感激! 谢谢!

【问题讨论】:

文件有多大?听起来你不应该使用 Pig。您是否考虑过直接通过 FileSystem 类使用 Hadoop API? 文件不是特别大,我遇到的问题是它是一个两遍过程,其中第二遍必须使用第一遍的状态(以地图的形式)。这两部分在逻辑上是结合在一起的,猪对于所有其他处理之前和之后肯定是必要的。我希望不需要单独的猪脚本,我很惊讶到目前为止我见过的文档,您只能将 UDF 作为 foreach 迭代语句的一部分执行 如果您真的想使用 Pig,您可以随时执行 GROUP ALL 并将整个数据包传递到您的 UDF。在这种情况下,您基本上只有一条记录,UDF 可以一次处理所有记录。 【参考方案1】:

免责声明:不建议将 Pig 用于此类任务。如果处理适合一个 CPU/RAM,为什么还要使用 MR?

可以的

我遇到了类似的问题并使用了自定义 StoreFunc 实现。

Pig 会检查 StoreLocation 是否存在且 OutputFormat 是否有效,因此您可以扩展一些现有的 Storage:

public class AdHocProcessing extends PigStorage 

    @Override
    public void putNext(Tuple tuple) throws IOException 
        // here you process input tuples...
    

    @Override
    public void cleanupOnSuccess(String location, Job job) throws IOException 
        // Here you may close your file, db connection, etc.

    
  

然后在 Pig 中它看起来像:

input = LOAD 'some.txt'

STORE input INTO './somewhere/' USING AdHocProcessing();

您可能还想在STORE 之前添加rmf ./somewhere(就像建议的here)。

【讨论】:

【参考方案2】:

您还可以执行以下操作:

input_table = LOAD ...;
input_table_all = GROUP input_table All;
-- 'input_table_all' now includes just a single entry
output_table = FOREACH input_table_all GENERATE MyUdf(*);

在 UDF 中,您将有一个包含“all”的元组,然后是输入表,您可以在 UDF 中处理该表。

【讨论】:

以上是关于在 Pig 中只执行一次 UDF的主要内容,如果未能解决你的问题,请参考以下文章

Pig 将关系作为参数传递给 UDF

Apache Pig - 在脚本中多次调用 Java UDF ToJSON

多个元组作为用 Java 编写的 pig UDF 中的输入

在 PIG 中执行 UDF 时出错

Pig:完成 UDF 后执行任务

在 PIG UDF 中调试