我正在按大约 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
也许与这个问题相似:
- 如何使用猪拉丁语"更新"列
这引用了一个 JIRA 票证:https://issues.apache.org/jira/browse/PIG-1693 如何使用 .. 表示法来表示所有剩余字段的示例:
D = FOREACH C GENERATE $1 .. ;
这假设你有 0.9.0+ PIG
按数字删除列
如果要删除第 5 列,可以这样做:
D = FOREACH C GENERATE .. $4, $6 .. ;
按名称删除列
如果要按名称删除列,则仅知道要删除的列的名称似乎是不可能的。但是,如果您知道此列之前和之后的列的名称,则有可能。如果你想删除colBeforeMyCol和colAfterMyCol之间的列,你可以这样做:
aliasAfter = FOREACH aliasBefore GENERATE
.. colBeforeMyCol, colAfterMyCol ..;