gpt4 book ai didi

hadoop - 用于计算 emp 时间的最小值、最大值的 Pig 脚本

转载 作者:可可西里 更新时间:2023-11-01 16:24:54 26 4
gpt4 key购买 nike

我是 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 或任何其他格式,请这样做,因为这只是一个示例。

提前致谢

问候,车坛

最佳答案

chararray 数据类型上使用 MAXMIN 不会给您预期的结果。如果你想避免编写 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)

关于hadoop - 用于计算 emp 时间的最小值、最大值的 Pig 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38942561/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com