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 ... ;
謝謝
謝謝你的回覆。假設UDF重新設計爲始終將String和Date同時附加到返回的Tuple(以避免「最小驚喜」問題)。豬拉丁文怎麼寫出來分割每個列表? – user2250400 2013-04-05 20:19:21
@ 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
使用多個「FILTER」而不是「SPLIT」沒有任何問題;實際上,Pig內部使用多個「FILTER」來重寫'SPLIT'。請參閱http://ofps.oreilly.com/titles/9781449302641/advanced_pig_latin.html中的「非線性數據流」 – 2013-04-08 17:42:58