如何使用通配符投影别名?

时间:2014-07-17 20:00:31

标签: apache-pig

我执行join A by id, B by id后,会得到包含字段A::f...B::f..的别名。 有没有办法只在A字段上投影?

C = join A by id, B by id;
D = filter C by B::n < 1000;
E = foreach D generate A::*;

我得到了

Unexpected character '*'

我想要的是E,架构相同A(即describe Edescribe A应打印完全相同的内容)

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您可以使用project-range expression来获取部分路径。

不幸的是,没有办法系统地删除A::前缀。如果你知道A的最后一个字段的名称(假设它是last),你可以这样做:

E = foreach D generate .. A::last;

如果您只想要来自B的字段,那么

E = foreach D generate B::first ..;

如果您确实需要应用特定架构,也许您可​​以定义一个在需要时应用此架构的宏,这样您就可以覆盖来自分组,加入等的任何更改。

答案 1 :(得分:0)

加入后无法拥有共同的别名。但您可以从联接结果生成特定列。 例如,

A = load 'data1' as (id,name,addr);
B = load 'data2' as (id,name2,addr2); 
C = join A by id,B by id;        //Now C has id,name,addr,id,name2,addr2

D = Foreach C generate($0,$1,$2);

现在关系D有了&#39; A&#39;关系列,例如id,name,addr only。