这是我到目前为止所做的事情: 输入数据(示例):
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我可以过滤掉我想。 我现在想要实现的是:从另一个中减去一个值以获得“响应时间”(这些是日志数据)。 平原猪拉丁有没有办法做到这一点? 在此先感谢您的任何帮助
答案 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
以不同方式处理它们。