2016-08-14 2 views
0

私はPigとHadoopの世界で初めてです。私が持っている問題はシンプルかもしれませんが、私は進めることができません。empタイミングのMin、Maxを計算するためのPigスクリプト

私は基本的に1日のデータでスワイプする以下のデータを持っています。 PIGを使用して、ある日の従業員が過ごした合計時間、つまり最初の時間内(オフィスに着く時間)と最後の外出時間(最後の1日のスワイプ)の差を計算する必要があります。

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を使用したアドバンス

よろしく、 チェタン

答えて

3

おかげで、あなたが結果を期待与えていません。

は、私がデータの使用を開始:あなたが執筆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

あなたがいる場合豚UDFを作成したい場合はhコードは

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'; 
です