如何在Pig中找到一列的平均值和两列的减法平均值?

Posted

技术标签:

【中文标题】如何在Pig中找到一列的平均值和两列的减法平均值?【英文标题】:How to find average of a column and average of subtraction of two columns in Pig? 【发布时间】:2016-06-05 14:58:57 【问题描述】:

我不熟悉使用 Pig Latin 编写脚本。我坚持写一个猪脚本,它将找到列值的平均值,并找到两列之间减去值的平均值。

我正在从具有以下 starttime 和 endtime 列的 csv 文件中读取数据:

"starttime","endtime",
"23","46",
"32","49",
"54","59"

到目前为止我尝试过的代码如下:

file = LOAD '/project/timestamp.csv' Using PigStorage(',') AS (st:int, et:int);
start_ts = FOREACH file GENERATE st;
grouped = group start_ts by st
ILLUSTRATE grouped

我得到的 ILLUSTRATE 输出如下,我无法应用 AVG 功能。

------------------------------------------
-------------------------------------------------------------------------------------
| grouped     | group:int     | file:bag:tuple(st:int,et:int)                 | 
-------------------------------------------------------------------------------------
|             |               | (, ), (, )                                        | 
-------------------------------------------------------------------------------------

谁能帮我获取开始时间的平均值,这将是 (23 + 32 + 54)/3 的结果

还有一些关于如何编码 (endtime -starttime)/no 的想法。记录(在这种情况下为 3 个)对我开始有很大帮助。

谢谢。

【问题讨论】:

【参考方案1】:

首先确保您正确加载数据。看起来您的数据周围有双引号,即 "。将数据加载为 chararray,替换双引号,然后将其转换为 int,最后在开始时间应用 AVG 函数.对于 endtime - starttime 的平均值,只需减去 2 个字段并应用 AVG。

A = LOAD '/project/timestamp.csv' Using PigStorage(',') AS (st:chararray, et:chararray);
B = FOREACH A GENERATE (int)REPLACE(st,'\\"','') as st,(int)REPLACE(et,'\\"','') as et;
C = GROUP B ALL;
D = FOREACH C GENERATE AVG(B.st),AVG(B.et - B.st);

【讨论】:

感谢您的回答。我认为您发布的代码已经通过将双引号替换为“”来处理双引号。因此,如果我只是加载我提供的带有双引号的数据集,仍然可以工作。但是,在第二条语句具有 REPLACE 之后,我遇到了错误。 : grunt> B = FOREACH A GENERATE (int)REPLACE(st, '\"', '') as st,(int)REPLACE(et,'\"', '') as et; Unexpected character '"' 。如果我做错了,请纠正我。 @H.Burns 我已经编辑了这一行。使用 \\ 转义双引号。 感谢您的回复。我已经设法在没有转义字符的情况下做到了。我还需要通过语句稍微调整组。我只为答案中一列的平均值添加了我的代码。请看一看。 @H.Burns Cool,很高兴它对您有帮助。感谢您做对了。【参考方案2】:

试试这个

file = LOAD '/project/timestamp.csv' Using PigStorage(',') AS (st:int, et:int);
grouped = group file by 1
AVG = foreach grouped generate AVG(file.st)

【讨论】:

【参考方案3】:

感谢 inquisitive_mind。 我的回答主要是根据他的回答稍作调整。 这仅适用于一列的平均值。

 file = LOAD '/project/timestamp.csv' Using PigStorage(',') AS (st:chararray, et:chararray);
cols  = FOREACH file GENERATE (int)REPLACE(st, '"', '') as st, (int)REPLACE(et, '"', '') as et;

grp_cols = GROUP cols all;


 avg = FOREACH grp_cols GENERATE AVG(cols.st);

DUMP avg

【讨论】:

以上是关于如何在Pig中找到一列的平均值和两列的减法平均值?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算两列的平均值?微软访问

如何创建一个上面一列下面两列的引导网格?

在 Pandas、Python 中查找具有相同第一列的所有行的最小值、最大值、平均值

如何计算另一列中特定值的列的平均值?

试图弄清楚如何使用列表返回数据框中每一列的平均值

如何根据R中的另一列获取一列的平均值