我如何从piglatin宏内部引用外部别名?

时间:2014-11-20 22:27:36

标签: macros apache-pig

我想在宏中使用别名:

foo = ....;
define my_macro (z) returns y {
   $y = join $z in id, foo on id;
};
a = my_macro(b);

唉,我收到了错误:

Undefined alias: macro_my_macro_foo_0

当然,我可以将foo作为参数传递:

define my_macro (foo, z) returns y {
   $y = join $z in id, $foo on id;
};
a = my_macro(foo,b);

这是正确的方法吗?

如果foo实际上是一个相对复杂的对象,是否会为my_macro的每个宏展开重新计算?

1 个答案:

答案 0 :(得分:0)

是的,第二种方法是正确的,你需要将别名作为参数传递给宏,否则它将在宏内部不可见。

另一方面,宏内定义的别名将无法在外部访问,如果您想访问别名,则使用此格式macro_<my macro_name>_<alias name suffixed with an instance>

我已经模拟了两个选项 1.从外到内访问别名(使用参数)
2.从内部宏到外部访问别名(使用宏扩展名称格式)

示例
in.txt

a,10,1000
b,20,2000
c,30,3000

<强> in1.txt

10,aaa
20,bbb
30,ccc

<强> Pigscript:

define my_macro (foo,z) returns y {
   $y = join $z by g1, $foo by f2;
   test = FOREACH $y generate $0,$2;
};

foo = LOAD 'in.txt' USING PigStorage(',') AS (f1,f2,f3);
b  = LOAD 'in1.txt' USING PigStorage(',') AS (g1,g2);
C = my_macro(foo,b);
DUMP C;
--DUMP macro_my_macro_test_0;

选项1的输出:
DUMP C

(10,aaa,a,10,1000)
(20,bbb,b,20,2000)
(30,ccc,c,30,3000)

选项2的输出:
DUMP macro_my_macro_test_0

(10,a)
(20,b)
(30,c)

使用宏有一些限制,比如
1.不允许嵌套在每个stmt中 2.不允许使用任何grunt命令
3.不允许包含用户定义的架构

我建议你参考下面的文档链接,这肯定会提供一些关于宏的更好的想法,以及如何在猪脚本中使用。
http://pig.apache.org/docs/r0.13.0/cont.html#macros