我想在宏中使用别名:
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
的每个宏展开重新计算?
答案 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