我有一堆看起来像这样的元组。包中的元组是预先订购的。
{(123,1383313457523,1,US),(123,1383313457543,2,US),(123,1383313457553,3,US)}
{(456,1383313457623,1,UK),(456,1383313457643,2,UK),(456,1383313457653,3,UK)}
{(789,1383313457723,1,UK),(789,1383313457743,2,UK),(789,1383313457753,3,UK)}
元组是:(id:chararray,time:long,event:chararray,location,chararray)
我想得到每个包的第一个元素。所以我的预期输出是:
(123,1383313457523,1,US)
(456,1383313457623,1,UK)
(789,1383313457723,1,UK)
我试过了:
data = load 'mydata.txt' USING PigStorage('\t');
A = FOREACH data GENERATE $0;
dump A;
它生成与我原来相同的数据包列表。
或者尝试仅提取ID
data = load 'mydata.txt' USING PigStorage('\t');
A = FOREACH data GENERATE $0.$0;
dump A;
我期待:
(123)
(456)
(789)
但我得到
{(123),(123),(123)}
{(456),(456),(456)}
{(789),(789),(789)}
如何调整脚本以获取我想要的数据。
答案 0 :(得分:1)
在嵌套的foreach中使用LIMIT
:
A = FOREACH data { first = LIMIT $0 1; GENERATE FLATTEN(first); }
你不能指望你订购的包中的元组,因为根据定义,包是无序的。但是,您也可以在嵌套的foreach中放置ORDER BY
:
A = FOREACH data { ord = ORDER $0 BY $1; first = LIMIT ord 1; GENERATE FLATTEN(first); }
如果将它们分成多行,我发现它们更具可读性:
A =
FOREACH data {
ord = ORDER $0 BY $1;
first = LIMIT ord 1;
GENERATE
FLATTEN(first);
};
我假设行李是按每个元组的第二个字段($1
)排序的。