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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值