【问题标题】:Unable to call a PIG macro inside a FOREACH block无法在 FOREACH 块内调用 PIG 宏
【发布时间】:2013-06-25 11:57:29
【问题描述】:

我无法从 foreach 中调用宏,例如

 DEFINE valid_attribute(id,attribute)
    RETURNS result {
            data       =       LOAD '/user/sathish/sessAttr' AS (id:chararray,browser_version:chararray);
         filtered_data      = FILTER data BY id == '$id' AND $attribute is NOT null;
         $result            = foreach filtered_data generate $attribute;
    };

    ip = load '/user/sathish/macros/inputParams' AS (id:chararray,attribute:chararray);
    op = foreach ip {generate valid_attribute('ip::id','ip:attribute');};
    dump op;

调用相同时我得到以下异常:

2013-06-25 04:47:42,239 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1070: Could not resolve valid_attribute using imports: [, org.apache.pig.builtin., org.apache.pig.impl.builtin.]

【问题讨论】:

    标签: hadoop hdfs apache-pig


    【解决方案1】:

    您不能以这种方式使用宏。宏返回关系(表),而不是单个值。 GENERATE 用于在您的关系中生成单独的值。您使用宏的方式看起来像是在尝试使用 UDF,这就是 Pig 在其默认类路径中查找函数的原因,就像任何 UDF 一样。

    【讨论】:

    • 感谢您的回复,如果我要编写 UDF,如何将我的输入参数与 UDF 与我尝试在此处加载的整个数据集进行比较?
    • 我没有听懂你的问题,但看看你的脚本,我想你可能正在尝试做类似于JOIN?在使用 UDF 之前,看看您是否可以在 Pig Latin 中完成您想做的事情。
    • 是的,我们可以在 Pig Latin 中做同样的事情,这里的属性是一个列名,场景是我们必须对多个列执行相同的过程,这将导致编写多个连接语句。因此尝试将代码模块化为可用于 n 列的函数。
    • 然后你需要编写一个执行join的宏。宏不是函数。它基本上是自动搜索和替换。你不能在 Pig Latin 语句中使用它,它是它自己的语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 2018-11-02
    相关资源
    最近更新 更多