pig脚本,用于计算emp计时的最小值和最大值

rdlzhqv9  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(352)

我对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

所需的最终输出是输出时间与输入时间之差

EmpID  Total_Time  
    1      9:00      
    2      10:00      
    3      8:00

我已经写了最后一行来得到最短和最长的时间,这样我就可以减去2,得到在办公室的总时间
请注意,如果您想假设时间为int或任何其他格式,请这样做,因为这只是一个例子。
提前谢谢
你好,契丹

j91ykkif

j91ykkif1#

使用 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)
holgip5t

holgip5t2#

如果您有兴趣创建pig udf,那么下面是代码:

package Conversion;
import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
public class ConvertDot extends EvalFunc<String> {
@Override
public String exec(Tuple input) throws IOException {
    String newstr = new String();
    if(input == null || input.size() == 0)
        return null;
    try{
        String str = (String)input.get(0);
        if(str.contains(":"))
            newstr = str.replace(':','.');
        else if(str.contains("."))
            newstr = str.replace('.',':');
        else
            newstr = str;
    }catch (Exception e){
        throw new IOException("Caught exception ", e);
    }
    return newstr;
    }
}

$ cat ComputeTotalTime.pig
    --Calculate Min, Man and Total time
    REGISTER /home/hadoop/Desktop/Abhinav/ConvertDotColon.jar
    emprec = LOAD '/home/hadoop/Desktop/Abhinav/swaptime.txt' USING       PigStorage(',')  AS (empid:int, in:chararray, out:chararray);
    cleandata = FOREACH emprec GENERATE empid, (double)Conversion.ConvertDot(in) as in, (double)Conversion.ConvertDot(out) as out;
    aggdata = group cleandata by empid;
    emptime = foreach aggdata generate group, MIN(cleandata.in), MAX(cleandata.out);
    results = foreach emptime generate $0 as EmpId, Conversion.ConvertDot((chararray)($2 - $1)) as Time_diff;
    STORE results INTO '/home/hadoop/Desktop/Abhinav/TotalTime.txt';

相关问题