猪脚本计算最小,最大的时间

时间:2016-08-14 13:10:12

标签: hadoop apache-pig bigdata

我是Pig和Hadoop世界的新手。我遇到的问题可能很简单,但我无法继续。

所以我有以下数据,基本上是数据刷卡一天。 我需要计算一名员工每天花费的总小时数,即使用PIG的第一次准时(他到达办公室的时间)和最后一次外出时间(当天的最后一次刷卡)之间的差异。

EmpID In_Time Out_Time
1     9:00     10:00
2     8:00     11:00
3     10:00    12:00
1     11:00    13:00
1     14:00    18:00
2     12:00    18:00
3     13:00    18:00

所以我编写了下面的脚本,但它似乎没有给出正确的结果。

grunt> emprec = load '/emptime/emptime' using PigStorage() as (empid:int,in:chararray,out:chararray);
grunt> aggdata = group emprec by empid;
grunt> emptime = foreach aggdata generate   (emprec.empid,MIN(emprec.in),MAX(emprec.out));

我似乎没有用编写的脚本获得正确的结果。

我需要的结果是

中级结果(据我所知)

EmpID  In_Time   Out_Time
1      9:00      18:00
2      8:00      18:00
3      10:00     18:00

所需的最终输出是Out_Time-In_Time

的差异
EmpID  Total_Time  
    1      9:00      
    2      10:00      
    3      8:00  

我已写完最后一行以获得最小和最大时间,因此我可以减去2并获得在办公室花费的总时间

请注意,如果您想将时间假设为Int或任何其他格式,请这样做,因为这只是一个例子。

先谢谢

此致 阿赫亚

1 个答案:

答案 0 :(得分:3)

MAX数据类型上使用MINchararray并未提供预期结果。如果你想避免写UDF,你可以遵循这个解决方案:

我从数据开始:

1,9:00,10:00
2,8:00,11:00
3,10:00,12:00
1,11:00,13:00
1,14:00,18:00
2,12:00,18:00
3,13:00,18:00
emprec = load '/home/cloudera/pig.txt' using PigStorage(',') as (empid:int,in:chararray,out:chararray);
cleandata = foreach emprec generate $0 as ID ,(double)REPLACE($1,':','.') as in_time,(double)REPLACE($2,':','.') as out_time; --convert time to double so you can use eval functions  on it
aggdata = group cleandata by ID; 
emptime = foreach aggdata generate group ,MIN(cleandata.in_time),MAX(cleandata.out_time);
results = foreach emptime generate $0 as Emp_ID,REPLACE((chararray)($2 - $1),'\\.(?s)','\\:0') as time_diff; --convert back to time
dump results;

输出:

(1,9:00)
(2,10:00)
(3,8:00)