从包中提取元组

时间:2014-03-09 18:16:00

标签: hadoop mapreduce apache-pig

我有一堆看起来像这样的元组。包中的元组是预先订购的。

{(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)}

如何调整脚本以获取我想要的数据。

1 个答案:

答案 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)排序的。