如何在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中找到一列的平均值和两列的减法平均值?的主要内容,如果未能解决你的问题,请参考以下文章