gpt4 book ai didi

hadoop - 从袋子里取出一个元组

转载 作者:行者123 更新时间:2023-12-02 19:51:21 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com