2

我有一个 pig 脚本,它从文件中读取输入并发送到我们的自定义 UDF,该 UDF 发送回带有 2 个键/值对的 Map。之后,我们必须将每个键值对保存在 2 个不同的位置。我们正在使用 Store 进行操作。我们面临的问题是我们在猪脚本中使用的每个 STORE 命令都在调用我们的自定义 UDF。

>REGISTER MyUDF.jar;

>LOADFILE = LOAD '$file' AS record:chararray;
>MAPREC = FOREACH LOADFILE GENERATE MyUDF(record);
>ERRLIST = FOREACH MAPREC {
>GENERATE $0#'errorRecord' AS ErrorRecord;
>};
>ERRLIST = FILTER ERRLIST BY ErrorRecord is not null;

>MLIST = FOREACH MAPREC {
>GENERATE $0#'mInfo' AS MRecord;
>};
>MLIST = FILTER MLIST BY MRecord is not null;

>STORE MLIST INTO 'fileOut';
>STORE ERRLIST INTO 'errorDir';

有没有一种方法在猪脚本中只调用一次 UDF,即使我们有多个 STORE....

4

1 回答 1

0

我认为幕后发生的事情是 MAPREC 没有被它的赋值语句填充。Pig 正在等待使用 MAPREC(两次)来确定它包含的内容。我建议通过使用 FOREACH 来迭代 MAPREC 来创建一个中间结构。这将强制调用 MyUDF 一次,然后在以下 FOREACH 语句中使用该中间结果两次代替 MAPREC。希望这是有道理的。

于 2012-09-02T14:25:11.990 回答