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

时间:2016-06-05 14:58:58

标签: hadoop apache-pig bigdata

我是使用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)对我来说非常有帮助。

感谢。

3 个答案:

答案 0 :(得分:1)

首先确保你正确加载数据。看起来像你有双引号,即“围绕你的数据。将数据加载为chararray,替换双引号然后将其转换为int,最后应用AVG函数为starttime 。对于avg of 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);

答案 1 :(得分:0)

试试这个

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

答案 2 :(得分:0)

感谢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