2012-04-24 12 views
1

データの各行について、フィールド1〜Nにフィールド0を掛けたいと思います。データには、行ごとに数百のフィールド(または変数その件に関するフィールドの数)、それぞれのペアを書くことは実現可能ではありません。次の(間違った)スニペットのような、ある範囲のフィールドを指定する方法はありますか?タプル内の複数のフィールドにタプルの指定フィールドを掛ける方法

A = LOAD 'foo.csv' USING PigStorage(','); 
B = FOREACH A GENERATE $0*($1,..); 

答えて

0

UDFが便利です。

のexec(タプル入力)を実装し、以下のように(テストされていない)のタプルのすべてのフィールドを反復処理:

public class MultiplyField extends EvalFunc<Long> { 
    public Long exec(Tuple input) throws IOException { 
     if (input == null || input.size() == 0) { 
      return null; 
     } 
     try { 
     Long retVal = 1; 
     for (int i = 0; i < input.size(); i++) { 
      Long j = (Long)input.get(i); 
      retVal *= j; 
     } 
     return retVal; 
     } catch(Exception e) { 
      throw WrappedIOException.wrap("Caught exception processing input row ", e); 
     } 
    } 
} 

その後、あなたのUDFを登録し、あなたのFOREACHからそれを呼び出します。

関連する問題