2016-08-14 83 views
0

我是豬和Hadoop世界的新手。我遇到的問題可能很簡單,但我無法繼續。豬腳本來計算最小值,最大值emp定時

所以我有下面的數據,基本上在一天的數據刷卡。 我需要計算員工在一天中花費的總小時數,即第一次按時間(他到達辦公室的時間)和最後一次使用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或任何其他格式,請這樣做,因爲這只是一個示例。

由於提前

問候, 阿赫亞

回答

3

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) 
0

如果你是有興趣創建Pig UDF然後h ere是代碼:

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'; 
相關問題