假设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语句。如果是即时的查询,没必要去单独编写自定义函数。