Hadoop 从包中提取元组
我有一个元组袋的关系,看起来像这样。袋子里的元组是预购的Hadoop 从包中提取元组,hadoop,mapreduce,apache-pig,Hadoop,Mapreduce,Apache Pig,我有一个元组袋的关系,看起来像这样。袋子里的元组是预购的 {(美国12313833457523,1)、(美国12313833457543,2)、(美国12313833457553,3)} {(英国,45613331347623,1)、(英国,45613331347643,2)、(英国,45613331347653,3)} {(789138331347723,1,英国),(789138331347743,2,英国),(789138331347753,3,英国) 其中元组是:(id:chararra
{(美国12313833457523,1)、(美国12313833457543,2)、(美国12313833457553,3)}
{(英国,45613331347623,1)、(英国,45613331347643,2)、(英国,45613331347653,3)}
{(789138331347723,1,英国),(789138331347743,2,英国),(789138331347753,3,英国)
其中元组是:(id:chararray,time:long,event:chararray,location,chararray)
我想得到每个包的第一个元素。因此,我的预期输出是:
(美国1231383331347523,1)
(英国456138331347623,1)
(789138331347723,1,英国)
我试过这个:
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中使用
限制
:
A = FOREACH data { first = LIMIT $0 1; GENERATE FLATTEN(first); }
A = FOREACH data { ord = ORDER $0 BY $1; first = LIMIT ord 1; GENERATE FLATTEN(first); }
您不能指望您的包中的元组被排序,因为根据定义,包是无序的。但是,您也可以在嵌套的foreach中按下订单:
A = FOREACH data { first = LIMIT $0 1; GENERATE FLATTEN(first); }
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
)