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 多个存储命令创建重复工作的主要内容,如果未能解决你的问题,请参考以下文章