2013-04-05 2 views
1

Pig UDF가 두 가지 유형의 데이터 레코드를 작성한다고 가정하십시오.Pig UDF 결합/분리 리턴

돼지 스크립트는이 UDF에서 결합 된 튜플의 반환 목록을 두 가지 방법으로 처리 할 수 ​​있습니까? 예를 들어

:

public Tuple exec (Tuple input) // input ignored in UDF for simplicity 
    { 
    Tuple t = TupleFactory.getInstance().newTuple(); 
    if (Math.random() < 0.5) 
     t.append ("less than half"); 
    else 
     t.append (new Date()); 
    return t; 
    } 

돼지 스크립트 같은 것을 수행해야합니다

register ... 
define myUDF ... 
data = load ...; 
combinedList = foreach data generate myUDF (data); 

stringList = filter combinedList by $0 instanceof java.lang.String; // ?? 
dateList = filter combinedLists by $0 instanceof java.util.Date; //?? 

store stringList into ... ; 
store dateList into ... ; 

감사합니다, 여기에 두 가지 문제가 있습니다

답변

0

. 어떠한 경우

  1. 당신은 이제까지 당신의 UDF에서 다른 데이터 유형을 반환한다. 이것은 최소한의 놀라움과 다른 두 가지 원칙에 위배됩니다. 유효하지 않은 값을 나타내려면 null 또는 유효하지 않은 상수를 반환하는 것이 훨씬 더 적합합니다.
  2. 여러 필터를 사용하여 수행하려는 작업이 없습니다.이 작업을 수행하려면 SPLIT 작업이 필요합니다. 돼지 내에서 instanceof을 사용하는 예가 잘못되었지만 기본 사용법은 SPLIT combinedList INTO stringList IF $0 instanceof String, dateList IF $0 instanceof Date입니다.
+0

답장을 보내 주셔서 감사합니다. UDF가 (최소 놀라움을 피하기 위해) 리턴 된 Tuple에 항상 String과 Date를 추가하도록 재 설계되었다고 가정합니다. 돼지 라틴어 스크립트는 어떻게 각 목록을 나누어 쓸 수 있습니까? – user2250400

+0

@ user2250400 포인트 Nr. 2 내 대답 - 상태로'스플릿'을 사용하십시오. 자세한 내용은 [Pig docs] (http://pig.apache.org/docs/r0.11.0/basic.html#SPLIT)를 참조하십시오. 기본 아이디어는'stringlist IF res. $ 0은 NULL이 아니며, datelist IF res. $ 1 IS NOT NULL'과 같은 것입니다. 그러나 UDF에서 'Date'또는 'null'중 하나를 반환하고 나중에 잘못된 레코드를 처리하려고 시도하는 대신 MR에서 잘못된 레코드를 처리 할 것을 제안합니다. – TC1

+0

'SPLIT'대신 여러 개의 'FILTER'를 사용하는 데는 아무런 문제가 없습니다. 실제로 Pig는 여러 개의 FILTER를 사용하여 내부적으로 'SPLIT'을 다시 작성합니다. http://ofps.oreilly.com/titles/9781449302641/advanced_pig_latin.html의 "비선형 데이터 흐름"을 참조하십시오. –