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

sf6xfgos  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(406)

我对用Pig拉丁语写脚本还不熟悉。我一直在写一个pig脚本,它将找到一列值的平均值,也将找到两列之间减去的值的平均值。
我正在从一个csv文件中读取数据,该文件包含starttime和endtime列,如下所示:

"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

我得到的演示输出如下,我不能应用avg函数。

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

有谁能帮我算出(23+32+54)/3的平均开始时间吗
还有一些关于如何编码(endtime-starttime)/记录数(在本例中为3)的想法对我的入门有很大帮助。
谢谢。

e3bfsja2

e3bfsja21#

试试这个

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

lg40wkob2#

首先确保正确加载数据。看起来您的数据周围有双引号,即“0”。将数据加载为chararray,替换双引号,然后将其转换为int,最后对starttime应用avg函数。对于endtime-starttime的avg,只需减去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);
xqk2d5yq

xqk2d5yq3#

多亏了好奇的头脑。我的答案主要是根据他的答案稍加修改。这只是一列的平均值。

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

相关问题