在pig中只执行一次udf

vmdwslir  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(365)

我见过这个问题,但我还没有看到答案。。
有没有可能一次从pig中调用一个udf?
我基本上希望通过对javaudf的一次调用来处理我存储的文本文件的转换。转换的内部结构在java中更容易处理,开销也很小,所以我不想将逻辑转换为pig。。
我成功调用自定义项的唯一方法是将其作为某个数据集上foreach语句的一部分。我以为我可以创建一个大小为1的虚拟元组,然后将其用作“foreach”的一部分,但我也不知道创建这个虚拟元组的语法。。
udf不需要返回任何东西,它将处理fs逻辑本身,我只想能够从pig脚本中执行它,因为在这里插入它更合理,然后作为更大工作流的一部分。。
任何帮助都将不胜感激!谢谢!

wpx232ag

wpx232ag1#

免责声明:不建议将pig用于此类任务。如果一个cpu/ram可以进行处理,那么为什么还要麻烦mr呢?

这是可以做到的

我遇到了类似的问题,并使用了自定义storefunc实现。
pig将检查storelocation是否存在,outputformat是否有效,因此您可以扩展一些现有存储:

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();

您还可以添加 rmf ./somewhere 之前 STORE (就像这里建议的那样)。

cczfrluj

cczfrluj2#

您还可以执行以下操作:

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(*);

在自定义项中有一个元组,其中包含“all”,然后是输入表,您可以在自定义项中处理该表。

相关问题