gpt4 book ai didi

hadoop - 如何在 pig latin 中选择具有最小值的记录

转载 作者:可可西里 更新时间:2023-11-01 14:32:05 26 4
gpt4 key购买 nike

我有带时间戳的样本,我正在使用 Pig 处理它们。我想为每一天找到样本的最小值和该最小值的时间。所以我需要选择包含具有最小值的样本的记录。

在下文中,为简单起见,我将在两个字段中表示时间,第一个是日期,第二个是一天中的“时间”。

1,1,4.5
1,2,3.4
1,5,5.6

要找到以下工作的最小值:

samples = LOAD 'testdata' USING PigStorage(',') AS (day:int, time:int, samp:float);
g = GROUP samples BY day;
dailyminima = FOREACH g GENERATE group as day, MIN(samples.samp) as samp;

但后来我忘记了最小值发生的确切时间。我希望我可以使用嵌套表达式。我尝试了以下方法:

dailyminima = FOREACH g {
minsample = MIN(samples.samp);
mintuple = FILTER samples BY samp == minsample;
GENERATE group as day, mintuple.time, mintuple.samp;
};

但是我收到了错误信息:

2012-11-12 12:08:40,458 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1000: 
<line 5, column 29> Invalid field reference. Referenced field [samp] does not exist in schema: .
Details at logfile: /home/hadoop/pig_1352722092997.log

如果我将 minsample 设置为常量,它不会提示:

dailyminima = FOREACH g {
minsample = 3.4F;
mintuple = FILTER samples BY samp == minsample;
GENERATE group as day, mintuple.time, mintuple.samp;
};

并且确实产生了一个合理的结果:

(1,{(2)},{(3.4)})

在写这篇文章时,我想到了使用一个单独的 JOIN:

dailyminima = FOREACH g GENERATE group as day, MIN(samples.samp) as minsamp;
dailyminima = JOIN samples BY (day, samp), dailyminima BY (day, minsamp);

这行得通,但结果(在实际情况下)连接了两个大型数据集,而不是搜索一天的值,这看起来不太健康。

在真实情况下,我实际上想找到最大和最小以及相关的时间。我希望嵌套表达式方法能让我同时完成这两项工作。

如能提出解决此问题的建议,我们将不胜感激。

最佳答案

感谢 alexeipab 提供指向 another SO question 的链接.

一个可行的解决方案(找到最小值和最大值以及相关时间)是:

dailyminima = FOREACH g {
minsamples = ORDER samples BY samp;
minsample = LIMIT minsamples 1;
maxsamples = ORDER samples BY samp DESC;
maxsample = LIMIT maxsamples 1;
GENERATE group as day, FLATTEN(minsample), FLATTEN(maxsample);
};

关于hadoop - 如何在 pig latin 中选择具有最小值的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13343863/

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