2012-04-24 1 views
1

데이터의 각 행에 대해 1부터 N까지 필드 0으로 곱하고 싶습니다. 데이터에 행 당 수백 개의 필드가있을 수 있습니다 그 문제에 대한 필드의 수), 그래서 각 쌍을 쓰는 것은 실현 가능하지 않습니다. 필드의 범위를 지정하는 방법이 있습니까? 다음과 같은 종류의 (잘못된) 스 니펫?터플의 주어진 필드에 튜플의 여러 필드를 곱하는 방법

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

답변

0

UDF이 여기에 유용 할 수 있습니다.

간부 (튜플 입력)를 구현하고 다음과 같이 (테스트하지) 튜플의 모든 필드를 반복 :

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에서 호출.