我有一个看起来像这样的元组袋关系。包中的元组已预购。{(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/