如何找到 Pig 中一列的平均值和两列相减的平均值?
How to find average of a column and average of subtraction of two columns in Pig?
我不熟悉使用 Pig Latin 编写脚本。我坚持要编写一个 pig 脚本,它会找到列值的平均值,还会找到两列之间相减值的平均值。
我正在从具有如下开始时间和结束时间列的 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 条)对我入门有很大帮助。
谢谢。
试试这个
file = LOAD '/project/timestamp.csv' Using PigStorage(',') AS (st:int, et:int);
grouped = group file by 1
AVG = foreach grouped generate AVG(file.st)
首先确保你正在加载数据 correctly.Looks 就像你有双引号,即 " 在你的 data.Load 数据周围作为 chararray,替换双引号然后将其转换为 int,最后应用starttime.For 结束时间的 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);
感谢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 Latin 编写脚本。我坚持要编写一个 pig 脚本,它会找到列值的平均值,还会找到两列之间相减值的平均值。
我正在从具有如下开始时间和结束时间列的 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 条)对我入门有很大帮助。
谢谢。
试试这个
file = LOAD '/project/timestamp.csv' Using PigStorage(',') AS (st:int, et:int);
grouped = group file by 1
AVG = foreach grouped generate AVG(file.st)
首先确保你正在加载数据 correctly.Looks 就像你有双引号,即 " 在你的 data.Load 数据周围作为 chararray,替换双引号然后将其转换为 int,最后应用starttime.For 结束时间的 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);
感谢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