如何在包中减去2个值?

时间:2016-06-04 17:21:57

标签: hadoop apache-pig

这是我到目前为止所做的事情: 输入数据(示例):

  

msg_snd,1,3,59,peek_req,-1,1414250523661,9

     

res_rcv,1,3,13,ERR,0,1414250523662,9

装载:

clientlog = LOAD '/user/hduser/pva4/input/client_example.csv' USING PigStorage(',') AS (code:chararray, client_id:int, loc_ts:int, length:int, op:chararray, err_code:int, time:long, thread_id:int);

分组:

g1 = GROUP clientlog BY (client_id, loc_ts);
g2 = FOREACH g1 GENERATE $1.time;

此输出为(示例):

  

({(1414250525776),(1414250525785)})

     

({(1414250525793),(1414250525785)})

     

({(1414250525793),(1414250525800)})

     

({(1414250525800)})

     

({()})

大多数行李中都有2个元组。另一个有0或1我可以过滤掉我想。 我现在想要实现的是:从另一个中减去一个值以获得“响应时间”(这些是日志数据)。 平原猪拉丁有没有办法做到这一点? 在此先感谢您的任何帮助

3 个答案:

答案 0 :(得分:0)

您可以编写自定义EvalFunc<String> udf来减去包中可用的两个值,使用下面的行进行foreach,

g2 = FOREACH g1 {GENERATE CUSTOM_UDF(g1);}

如何编写UDF http://lpaste.net/165352可能很有用

答案 1 :(得分:0)

USE UDF减去包中的元素。

答案 2 :(得分:0)

简单的方法是将第一个元组乘以-1然后应用sum函数:

g2 = FOREACH g1 GENERATE -1*$1.time.$0;
g3 = FOREACH g2 GENERATE FLATTEN(group),SUM(g1.time);

对于少于两个元组的行李,请使用bincond以不同方式处理它们。