我有一个看起来像这样的元组袋关系。包中的元组已预购。
{(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)}
如何调整脚本以获取所需的数据。

最佳答案

在嵌套的foreach中使用LIMIT:

A = FOREACH data { first = LIMIT $0 1; GENERATE FLATTEN(first); }

您不能指望要订购的包中的元组,因为根据定义,这是无序的。但是,您也可以将ORDER BY放在嵌套的foreach中:
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)排序的。

关于hadoop - 从袋子里取出一个元组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22286087/

10-12 23:49