1. 程式人生 > >pig自定義FilterFunc實現資料流的過濾

pig自定義FilterFunc實現資料流的過濾

假設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類,如下:

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);
		}

	}

}
將該類打成jar包:besttonePigUDF.jar,上傳你執行pig命令的目錄下面

然後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語句。如果是即時的查詢,沒必要去單獨編寫自定義函式。