2011-07-29 15 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) 

結合されたセットを格納して再ロードせずに反復する方法はありますか?

+0

[ERROR 1066:別名のイテレータを開くことができません]を探して(http://stackoverflow.com/questions/34495085/error-1066-unable-to-open-iterator -for-alias-in-pig-generic-solution)は、[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は、これらの2つの質問をリンクしてバックリンクすることによって、無限ループを作成しました。 :) –

関連する問題