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

ikfrs5lh  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(300)

我有一个要在宏中使用的别名:

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 ?

g6ll5ycj

g6ll5ycj1#

是的,第二种方法是正确的,您需要将别名作为参数传递给宏,否则它在宏中不可见。
另一方面,宏内部定义的别名将不能在外部访问,如果您想访问别名,请使用此格式 macro_<my macro_name>_<alias name suffixed with an instance> 我已经模拟了两种选择
1从外到内访问别名宏(使用参数)
2从宏内部到外部访问别名(使用宏扩展名称格式)
例子
在.txt中

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

in1.txt文件

10,aaa
20,bbb
30,ccc

Pig手稿:

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的输出:
卸载c

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

选项2的输出:
转储宏\u我的\u宏\u测试\u 0

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

在使用宏时有一些限制,例如
1不允许为每个stmt嵌套内部
2不允许使用任何咕噜命令
三。不允许包含用户定义的架构
我建议你参考下面的文档链接,这肯定会给一些关于宏的更好的想法,以及如何使用内部pig脚本。
http://pig.apache.org/docs/r0.13.0/cont.html#macros

相关问题