2011-07-29 1 views
1

해당 월의 일 수와 1 년 월 키의 데이터 세트가 결합 된 하나의 세트에 가입하려고합니다. 내가 가입하여 FOREACH를 시도한 후 오류가 발생합니다 : 1066 ... 백엔드 오류 : 스칼라에 출력에 둘 이상의 행이 있습니다.조인 된 세트를 반복 한 후 PIG 오류 1066.

다음
$ hadoop fs -cat DIM/\* 
2011,01,31 
2011,02,28 
2011,03,31 
2011,04,30 
2011,05,31 
2011,06,30 
2011,07,31 
2011,08,31 
2011,09,30 
2011,10,31 
2011,11,30 
2011,12,31 

$ hadoop fs -cat ACCT/\* 
2011,7,26,key1,23.25,2470.0 
2011,7,26,key2,10.416666666666668,232274.08333333334 
2011,7,26,key3,82.83333333333333,541377.25 
2011,7,26,key4,78.5,492823.33333333326 
2011,7,26,key5,110.83333333333334,729811.9166666667 
2011,7,26,key6,102.16666666666666,675941.25 
2011,7,26,key7,118.91666666666666,770896.75 

툴툴 거리는 소리에 : 그러나 나는 그것을 저장하고이 스키마가 작동 "가입"창고에 다시로드하면

grunt> DIM = LOAD 'DIM' USING PigStorage(',') AS (year:int, month:int, days:int); 
grunt> ACCT = LOAD 'ACCT' USING PigStorage(',') AS (year:int, month:int, day: int, account:chararray, metric1:double, metric2:double); 
grunt> AjD = JOIN ACCT BY (year,month), DIM BY (year,month) USING 'replicated'; 
grunt> dump AjD; 
... 
(2011,7,26,key1,23.25,2470.0,2011,7,31) 
(2011,7,26,key2,10.416666666666668,232274.08333333334,2011,7,31) 
(2011,7,26,key3,82.83333333333333,541377.25,2011,7,31) 
(2011,7,26,key4,78.5,492823.33333333326,2011,7,31) 
(2011,7,26,key5,110.83333333333334,729811.9166666667,2011,7,31) 
(2011,7,26,key6,102.16666666666666,675941.25,2011,7,31) 
(2011,7,26,key7,118.91666666666666,770896.75,2011,7,31) 
grunt> describe AjD; 
AjD: {ACCT::year: int,ACCT::month: int,ACCT::day: int,ACCT::account: chararray,ACCT::metric1: double,ACCT::metric2: double,DIM::year: int,DIM::month: int,DIM::days: int} 

grunt> FINAL = FOREACH AjD 
>> GENERATE ACCT.year, ACCT.month, ACCT.account, (ACCT.metric2/DIM.days); 
grunt> dump FINAL; 
... 
ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1066: Unable to open iterator for alias FINAL. Backend error : Scalar has more than one row in the output. 1st : (2011,7,26,key1,23.25,2470.0), 2nd :(2011,7,26,key2,10.416666666666668,232274.08333333334) 

여기

같은 문제로 축약 세트입니다 :

grunt> STORE AjD INTO 'AjD' using PigStorage(','); 
grunt> AjD2 = LOAD 'AjD' USING PigStorage(',') AS (year:int, month:int, day:int, account:chararray, metric1:double, metric2:double, year2:int, month2:int, days:int); 

grunt> FINAL = FOREACH AjD2                 
>> GENERATE year, month, account, (metric2 /days);   

grunt> dump FINAL; 
... 
(2011,7,key1,79.6774193548387) 
(2011,7,key2,7492.712365591398) 
(2011,7,key3,17463.782258064515) 
(2011,7,key4,15897.526881720427) 
(2011,7,key5,23542.319892473122) 
(2011,7,key6,21804.5564516129) 
(2011,7,key7,24867.637096774193) 

저장 및 다시로드하지 않고 조인 된 세트를 반복 (FOREACH) 할 수있는 방법이 있습니까?

+0

[ERROR 1066 : 별명에 대한 반복자를 열 수 없습니다]을 찾고 (http://stackoverflow.com/questions/34495085/error-1066-unable-to-open-iterator -for-alias-in-pig-generic-solution)은 일반적인 솔루션입니다 (http://stackoverflow.com/a/34495086/983722). –

답변

5

:: Operator을 사용해보십시오. 어떤 열을 지정 했습니까?

(ACCT.metric2/DIM.days)(ACCT::metric2/DIM::days)으로 바꿉니다.

이 게시물을 발견 사람들을 위해

... 
FINAL = FOREACH AjD 
     GENERATE 
      ACCT.year, ACCT.month, ACCT.account,(ACCT::metric2/DIM::days); 
+0

모든 열 한정자는 '::'이어야합니다. –

+0

답변 해 주셔서 감사합니다. 이 [관련 질문] (http://stackoverflow.com/questions/8051180/pig-how-to-reference-columns-in-a-foreach-after-a-join) 링크를 추가하십시오. – shoover

+0

@shoover는이 두 질문을 연결하고 백 링크함으로써 무한 루프를 만들었습니다. :) –