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

Posted

技术标签:

【中文标题】Pig 多个存储命令创建重复工作【英文标题】:Pig multiple store commands creating duplicate work 【发布时间】:2012-09-02 13:52:58 【问题描述】:

我有一个 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';

pig 脚本中是否有一种方法可以只调用一次 UDF,即使我们有多个 STORE....

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢克里斯的意见。我们会试试的。但是当我们使用 Pig 'Explain' 时,它会显示两个 Map reduce 计划,每个计划用于 2 个 STORE 命令,就像在 pig 脚本中一样......这让我认为我们提取/使用 pig 关系的方式可能是错误的......任何输入在这个 对。我希望看到这两个商店的 mapreduce 步骤,因为在幕后 STORE UDF 与 OutputFormat 类交互,并且每个 reducer 通常有一个 OutputFormat。 Pig 不会逐行执行脚本。相反,它逐步为赋值语句中的每个“变量”建立公式(因为没有更好的词)。我不知道 Pig 是如何决定何时真正开始 mapreduce 步骤的,但在你的情况下,它等待的时间太长了。我的提议有望在处理过程的早期触发另一个 mapreduce 步骤。 克里斯问题不同。我们不是在 grunt shell 中执行上述 pig 脚本,而是通过 PigServer 运行。如果我们在 grunt shell 中运行,则只会完成一个 map reduce 计划并按预期工作。 PigServer 默认不在多查询模式下执行。所以我们所做的是 pigServer.setBatchOn();pigServer.registerFile('pigFile');pigServer.executeBatch();这些改变奏效了。谢谢

以上是关于Pig 多个存储命令创建重复工作的主要内容,如果未能解决你的问题,请参考以下文章

在Oracle中临时存储多个值[重复]

使用不同的命令创建多个Tkinter按钮但外部变量[重复]

如何启用多个命令[重复]

处理 PIG Latin 中的重复记录

如何使用 Pig 将数据存储在 HDFS 上的多个分区文件中

删除 apache pig 中的重复行