Pig脚本相对较新。我在下面的脚本中导出了按错误代码,名称及其各自计数分组的错误详细信息。
A = LOAD 'traffic_error_details.txt' USING
PigStorage(',') as (id:int, error_code:chararray,error_name:chararray, error_status:int);
B = FOREACH A GENERATE A.error_code as errorCode,A.error_name as
errorName,A.error_status as errorStatus;
C = GROUP B by ($0,$1,$2);
F = FOREACH C GENERATE group, COUNT(B) as count;
Dump F;
上面会给出如下结果:
我也希望显示错误百分比。如下所示:
此处考虑的请求总数为50.其中21%成功。剩余是错误%的拆分。 那么如何在同一个脚本和同一个元组中计算总数呢?这样%可以计算为(计数/总计)* 100。 Total指的是所有记录的计数error_details.txt。
答案 0 :(得分:0)
在您获得每个错误代码的计数后,您需要执行paper-dialog
来查找错误总数并将该字段添加到每一行。然后,您可以将错误代码计数除以总计数以查找百分比。确保将计数变量从类型GROUP ALL
转换为类型long
以避免任何整数除法问题。
这是代码:
double
您会注意到我稍微修改了您的代码。我按A = LOAD 'traffic_error_details.txt' USING PigStorage(',') as
(id:int, errorCode:chararray, errorName:chararray, errorStatus:int);
B = FOREACH A GENERATE errorCode, errorName, errorStatus;
C = GROUP B BY (errorCode, errorName, errorStatus);
D = FOREACH C GENERATE
FLATTEN(group) AS (errorCode, errorName, errorStatus),
COUNT(B) AS num;
E = GROUP D ALL;
F = FOREACH E GENERATE
FLATTEN(D) AS (errorCode, errorName, errorStatus, num),
SUM(D.num) AS num_total;
G = FOREACH F GENERATE
errorCode,
errorName,
errorStatus,
num,
(double)num/(double)num_total AS percent;
分组而不是(errorCode, errorName, errorStatus)
。如果您将来修改代码并且位置不相同,那么引用字段名称本身而不是其位置会更安全。