在 Pig 中只执行一次 UDF
Posted
技术标签:
【中文标题】在 Pig 中只执行一次 UDF【英文标题】:Executing a UDF in Pig only once 【发布时间】:2014-02-25 20:25:26 【问题描述】:我已经看到这个问题,但我还没有看到答案..
是否可以一次从 pig 调用 UDF?
我基本上希望通过对 java UDF 的一次调用来处理我存储的文本文件的转换。转换的内部在Java中更容易处理,开销很小,所以我宁愿不将逻辑转换为pig..
我成功调用 UDF 的唯一方法是在某些数据集上作为 FOREACH 语句的一部分。我认为我可以创建一个大小为 1 的虚拟元组,然后将其用作“foreach”的一部分,但我也无法弄清楚创建这个虚拟元组的语法..
UDF 不需要返回任何内容,它会处理 FS 逻辑本身,我只想能够从 pig 脚本中执行它,因为在此处检测它更有意义,然后作为更大工作流程的一部分..
任何帮助将不胜感激! 谢谢!
【问题讨论】:
文件有多大?听起来你不应该使用 Pig。您是否考虑过直接通过 FileSystem 类使用 Hadoop API? 文件不是特别大,我遇到的问题是它是一个两遍过程,其中第二遍必须使用第一遍的状态(以地图的形式)。这两部分在逻辑上是结合在一起的,猪对于所有其他处理之前和之后肯定是必要的。我希望不需要单独的猪脚本,我很惊讶到目前为止我见过的文档,您只能将 UDF 作为 foreach 迭代语句的一部分执行 如果您真的想使用 Pig,您可以随时执行 GROUP ALL 并将整个数据包传递到您的 UDF。在这种情况下,您基本上只有一条记录,UDF 可以一次处理所有记录。 【参考方案1】:免责声明:不建议将 Pig 用于此类任务。如果处理适合一个 CPU/RAM,为什么还要使用 MR?
可以的
我遇到了类似的问题并使用了自定义 StoreFunc 实现。
Pig 会检查 StoreLocation 是否存在且 OutputFormat 是否有效,因此您可以扩展一些现有的 Storage:
public class AdHocProcessing extends PigStorage
@Override
public void putNext(Tuple tuple) throws IOException
// here you process input tuples...
@Override
public void cleanupOnSuccess(String location, Job job) throws IOException
// Here you may close your file, db connection, etc.
然后在 Pig 中它看起来像:
input = LOAD 'some.txt'
STORE input INTO './somewhere/' USING AdHocProcessing();
您可能还想在STORE
之前添加rmf ./somewhere
(就像建议的here)。
【讨论】:
【参考方案2】:您还可以执行以下操作:
input_table = LOAD ...;
input_table_all = GROUP input_table All;
-- 'input_table_all' now includes just a single entry
output_table = FOREACH input_table_all GENERATE MyUdf(*);
在 UDF 中,您将有一个包含“all”的元组,然后是输入表,您可以在 UDF 中处理该表。
【讨论】:
以上是关于在 Pig 中只执行一次 UDF的主要内容,如果未能解决你的问题,请参考以下文章