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

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

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

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

唉,我得到了一个错误:

  1. Undefined alias: macro_my_macro_foo_0

我当然可以通过 foo 作为参数:

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

这条路对吗?
如果 foo 其实是一个比较复杂的对象,会不会每次宏展开都会重新计算 my_macro ?

g6ll5ycj

g6ll5ycj1#

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

  1. a,10,1000
  2. b,20,2000
  3. c,30,3000

in1.txt文件

  1. 10,aaa
  2. 20,bbb
  3. 30,ccc

Pig手稿:

  1. define my_macro (foo,z) returns y {
  2. $y = join $z by g1, $foo by f2;
  3. test = FOREACH $y generate $0,$2;
  4. };
  5. foo = LOAD 'in.txt' USING PigStorage(',') AS (f1,f2,f3);
  6. b = LOAD 'in1.txt' USING PigStorage(',') AS (g1,g2);
  7. C = my_macro(foo,b);
  8. DUMP C;
  9. --DUMP macro_my_macro_test_0;

选项1的输出:
卸载c

  1. (10,aaa,a,10,1000)
  2. (20,bbb,b,20,2000)
  3. (30,ccc,c,30,3000)

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

  1. (10,a)
  2. (20,b)
  3. (30,c)

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

展开查看全部

相关问题