2012-09-02 34 views
2

我有一个猪脚本从文件中读取输入并发送到我们的自定义UDF,它发回带有2个键/值对的映射。之后,我们必须将每个关键值对保存在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将只被调用一次,即使我们有多个商店....

回答

0

我认为这有什么幕后发生的事情是MAPREC ISN”由其赋值语句填充。猪正在等待,直到使用MAPREC(这是两次)来找出它包含的内容。我建议通过使用FOREACH来遍历MAPREC来创建一个中间结构。这将强制调用MyUDF一次,然后在以下FOREACH语句中使用该中间结果两次代替MAPREC。希望这是有道理的。

+0

谢谢克里斯的输入。我们会尝试。但是,当我们使用Pig'Explain'时,它显示了两个Map Reduce计划,每个计划用于2个STORE命令,就像猪脚本一样....这使我认为我们如何提取/使用猪关系可能是错误的......任何输入在这 – Sarath

+0

没错。我期望看到两个商店的mapreduce步骤,因为STORE UDF与OutputFormat类进行交互,每个Reducer通常有一个OutputFormat。 –

+0

Pig不会逐行执行逐行执行的脚本。相反,它会逐步为赋值语句中的每个“变量”建立公式(缺少更好的单词)。我不知道Pig如何决定何时开始mapreduce步骤,但在你的情况下,它等待太久。我提出的建议有望在处理的早期触发另一个mapreduce步骤。 –