2016-08-14 2 views
0

나는 돼지와 하둡 세계에 처음 온 사람입니다. 내가 가진 문제는 간단 할 수도 있지만 계속할 수는 없습니다.최소, 최대 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)); 

필자는 스크립트 작성시 올바른 결과를 얻지 못하는 것 같습니다.

내가 필요 결과는 필요한 최종 출력이 Out_time을-IN-time보다

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

의 차이가 나는 마지막을 쓸 수 있었

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

(내 이해)

중간 결과는 라인은 최소 및 최대 시간을 얻을 수 있도록 내가 2를 빼고 총 시간을 사무실에서 보냈다.

시간을 Int 또는 다른 형식으로 가정하려면이 예제를 참조하십시오. chararray 데이터 형식에 MAX, MIN를 사용하여 사전

감사합니다, Chetan에

답변

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