2014-07-11 8 views
1

내 입력 파일이 내 스크립트 아래돼지 스크립팅

a,t1,1000,100 
a,t1,2000,200 
a,t1,1000,500 
b,t2,1000,200 
b,t2,5000,100 

입니다 작동합니다. 그것은 합계 오류를 던지고있다. 당신이 그것을

myinput  = LOAD 'file' USING PigStorage(',') AS(a1:chararray,a2:chararray,total:int,div:int) 
for_disticnt = FOREACH myinput GENERATE a2; 
grp_disticnt = GROUP for_distinct ALL; 
disticnt_count=FOREACH grp_disticnt GENEARATE COUNT(for_disticnt) as finalcount; 
grouped = GROUP myinput BY a1; 
result = FOREACH grouped GENEARTE group,SUM(myinput.total/myinput.div)/distinct_count; 

를 해결시겠습니까 것은 너무 그룹화의 출력이

((a),{(a,t1,1000,100),(a,t1,2000,200)}) 

((b),{(b,t2,1000,200),(b,t2,5000,100)}) 

내가 하나의 그룹에 대한 가방의 각 튜플에 $ (3) $ 2 분할하고자하고 다음의 합을하고 마지막으로 그 SUM을 별개의 $ 1로 나눕니다.

그룹화 된 각 가방에 대한 합계 논리는 아래에 있습니다.

[(1000/100)+((2000/200)]/count(distinct $1 in myinput) 

[(1000/200)+(5000/100)]/count(distinct $1 in myinput) 

내가 원하는 출력 아래

(a,10) 
(b,27) 

답변

0
myinput = load 'data' using PigStorage(',') as 
      (a1:chararray, a2:chararray, total:int, div:int); 

sub = foreach myinput generate a2; 
dist = DISTINCT sub; 
grpd = group dist all; 
X = foreach grpd generate COUNT_STAR(dist); 

A = foreach myinput generate a1, (total/div) as quotient; 
grouped = group A by a1; 
B = foreach grouped generate group, SUM(A.quotient) as sums; 
C = CROSS B, X; 
final = foreach C generate $0, ((float)($1)/(float)($2)); 

출력

(a,11.0) 
(b,27.5) 
+0

나는 각 튜플 총과 사업부 분할하고 모든의 합을 찾고자하는 번호 각 튜플의 분할 결과 –

+0

나는 당신이 원하는 출력에 혼란스러워합니다. 나는 [(1000/200) + (5000/100)]/count (myinput에서 별개 $ 1)가'5'를 얻는 방법을 모르겠다. – gobrewers14

+0

어쨌든, 내가 생각하는 바에 대한 나의 대답을 편집했다. 그러나 당신은 두 번째 계산을 위해'5'를 어떻게 얻었는지 여전히 확신 할 수 없습니다. – gobrewers14