Pig脚本按

时间:2018-03-03 13:30:17

标签: apache-pig

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;

上面会给出如下结果:

  1. INVALID_PARAM,REQUEST_ERROR,10
  2. INTERNAL_ERROR,SERVER_ERROR,15
  3. NOT_ALLOWED,ACCESS_ERROR,4
  4. UNKNOWN_ERR,UNKNOWN_ERROR,10
  5. NIL,NIL,11
  6. 我也希望显示错误百分比。如下所示:

    1. INVALID_PARAM,REQUEST_ERROR,10,20%
    2. INTERNAL_ERROR,SERVER_ERROR,15,30%
    3. NOT_ALLOWED,ACCESS_ERROR,4,9%
    4. UNKNOWN_ERR,UNKNOWN_ERROR,10,20%
    5. NIL,NIL,11,21%
    6. 此处考虑的请求总数为50.其中21%成功。剩余是错误%的拆分。 那么如何在同一个脚本和同一个元组中计算总数呢?这样%可以计算为(计数/总计)* 100。 Total指的是所有记录的计数error_details.txt。

1 个答案:

答案 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)。如果您将来修改代码并且位置不相同,那么引用字段名称本身而不是其位置会更安全。