pig自定義FilterFunc實現資料流的過濾
阿新 • • 發佈:2019-01-04
假設test.txt檔案中有如下資料:
xiaojun 28 shanghai
yangna 24 lanzhou
yangna 24 shanghai
xiaojun 28 上海
想實現過濾其中為上海的資料。我們可以寫 :
a = load 'test.txt' as (name:chararray,age:int,city:chararray);
b = filter a by city=='shanghai' or city=='上海';
dump b;
作為例子,我們可以簡化指令碼的編寫,將city=='shanghai' or city=='上海'這部分邏輯封裝成一個過濾函式。實現自定義過濾函式,必須繼承自FilterFunc類,如下:
將該類打成jar包:besttonePigUDF.jar,上傳你執行pig命令的目錄下面package com.besttone.pig; import java.io.IOException; import org.apache.pig.FilterFunc; import org.apache.pig.backend.executionengine.ExecException; import org.apache.pig.data.Tuple; public class IsShanghai extends FilterFunc { @Override public Boolean exec(Tuple tuple) throws IOException { if (tuple == null || tuple.size() == 0) { return false; } try { Object object = tuple.get(0); if (object == null) { return false; } String city = (String) object; if (city.equals("shanghai") || city.equals("上海")) { return true; } else { return false; } } catch (ExecException e) { throw new IOException(e); } } }
然後pig -x local進入grunt命令列。
首先註冊jar:
register besttonePigUDF.jar;
給函式定義一個別名,方便使用:
define isShanghai com.besttone.pig.IsShanghai();
這樣我們就可以直接使用這個函式來過濾上海資料了:
b = filter a by isShanghai(city);
c= filter a by not isShanghai(city);
總結:自定義函式的用途是用來封裝、重用一些複雜的業務邏輯,簡化pig語句。如果是即時的查詢,沒必要去單獨編寫自定義函式。