4

我正在通过大约 20 个 ID 的列表过滤表。现在我的代码如下所示:

A = LOAD 'ids.txt' USING PigStorage();
B = LOAD 'massive_table' USING PigStorage();
C = JOIN A BY $0, B BY $0;
D = FOREACH C GENERATE $1, $2, $3, $4, ...
STORE D INTO 'foo' USING PigStorage();

我不喜欢的是 D 行,我必须重新生成一个新表以通过显式声明我想要呈现的每个其他列(有时是很多列)来摆脱连接列。我想知道是否有相当于:

FILTER B BY $0 IN (A)

或者:

DROP $0 FROM C
4

2 回答 2

9

也许类似于这个问题:

这引用了 JIRA 票证:https ://issues.apache.org/jira/browse/PIG-1693 ,其中举例说明了如何使用 .. 符号来表示所有剩余字段:

D = FOREACH C GENERATE $1 .. ;

这假设你有 0.9.0+ PIG

于 2012-05-31T16:00:33.080 回答
3

按数字删除列

如果你想删除第 5 列,你可以这样做:

D = FOREACH C GENERATE .. $4, $6 .. ;

按名称删除列

如果要按名称删除列,仅知道要删除的列的名称似乎是不可能的。但是,如果您直接知道该列之前和之后的列名,则有可能。如果你想删除 colBeforeMyCol 和 colAfterMyCol 之间的列,你可以这样做:

aliasAfter = FOREACH aliasBefore GENERATE 
             .. colBeforeMyCol, colAfterMyCol ..;
于 2016-08-22T07:27:10.227 回答