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

Performance Pig多个存储命令创建重复工作,performance,apache-pig,Performance,Apache Pig,我有一个pig脚本,它从一个文件读取输入并发送到我们的自定义UDF,它返回一个带有2个键/值对的映射。之后,我们必须将每个键值对保存在两个不同的位置。我们正在用商店做这件事。我们面临的问题是,我们在pig脚本中使用的每个STORE命令都在调用我们的自定义UDF >REGISTER MyUDF.jar; >LOADFILE = LOAD '$file' AS record:chararray; >MAPREC = FOREACH LOADFILE GENERATE MyUDF(

我有一个pig脚本,它从一个文件读取输入并发送到我们的自定义UDF,它返回一个带有2个键/值对的映射。之后,我们必须将每个键值对保存在两个不同的位置。我们正在用商店做这件事。我们面临的问题是,我们在pig脚本中使用的每个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只被调用一次,即使我们有多个存储…

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

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

谢谢克里斯的意见。我们会试试的。但是当我们使用Pig“Explain”时,它显示了两个Map-reduce计划,每个计划用于Pig脚本中的两个STORE命令……这让我想到,我们扩展/使用Pig关系的方式可能是错误的……这方面的任何输入都是正确的。我希望看到这两个存储的mapreduce步骤,因为在幕后,存储UDF与OutputFormat类交互,每个reducer通常有一个OutputFormat。Pig不会逐行执行脚本。相反,它逐步为赋值语句中的每个“变量”建立公式(因为没有更好的词)。我不知道Pig如何决定何时实际启动mapreduce步骤,但在您的情况下,它等待的时间太长了。我的建议有望在处理过程的早期触发另一个mapreduce步骤。我们不是在grunt shell中执行上述pig脚本,而是通过PigServer运行。如果我们在grunt shell中运行,那么只有一个map-reduce计划完成,并按预期工作。默认情况下,PigServer不在多查询模式下执行。所以我们所做的是pigServer.setBatchOn();注册表文件('pigFile');pigServer.executeBatch();这些变化奏效了。感谢克里斯的支持。我们会试试的。但是当我们使用Pig“Explain”时,它显示了两个Map-reduce计划,每个计划用于Pig脚本中的两个STORE命令……这让我想到,我们扩展/使用Pig关系的方式可能是错误的……这方面的任何输入都是正确的。我希望看到这两个存储的mapreduce步骤,因为在幕后,存储UDF与OutputFormat类交互,每个reducer通常有一个OutputFormat。Pig不会逐行执行脚本。相反,它逐步为赋值语句中的每个“变量”建立公式(因为没有更好的词)。我不知道Pig如何决定何时实际启动mapreduce步骤,但在您的情况下,它等待的时间太长了。我的建议有望在处理过程的早期触发另一个mapreduce步骤。我们不是在grunt shell中执行上述pig脚本,而是通过PigServer运行。如果我们在grunt shell中运行,那么只有一个map-reduce计划完成,并按预期工作。默认情况下,PigServer不在多查询模式下执行。所以我们所做的是pigServer.setBatchOn();注册表文件('pigFile');pigServer.executeBatch();这些变化奏效了。谢谢