2013-04-05 66 views
1

假設Pig UDF創建兩種不同類型的數據記錄。合併/分離Pig UDF返回

Pig腳本如何以兩種不同的方式處理來自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操作。雖然你在Pig中使用instanceof的例子是錯誤的,但基本用法就像SPLIT combinedList INTO stringList IF $0 instanceof String, dateList IF $0 instanceof Date
+0

謝謝你的回覆。假設UDF重新設計爲始終將String和Date同時附加到返回的Tuple(以避免「最小驚喜」問題)。豬拉丁文怎麼寫出來分割每個列表? – user2250400 2013-04-05 20:19:21

+0

@ user2250400請參閱第Nr。 2在我的答案 - 使用條件'SPLIT'。請閱讀更多內容[在Pig文檔中](http://pig.apache.org/docs/r0.11.0/basic.html#SPLIT)。基本想法就像'SPLIT c INTO stringlist IF res。$ 0 IS NOT NULL,datelist IF res。$ 1 IS NOT NULL'。但是,我仍然建議您從UDF中返回Date或null,然後在MR中處理無效記錄,而不是您嘗試執行的方式。 – TC1 2013-04-05 20:26:09

+0

使用多個「FILTER」而不是「SPLIT」沒有任何問題;實際上,Pig內部使用多個「FILTER」來重寫'SPLIT'。請參閱http://ofps.oreilly.com/titles/9781449302641/advanced_pig_latin.html中的「非線性數據流」 – 2013-04-08 17:42:58