`
qindongliang1922
  • 浏览: 2147579 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:116328
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:124593
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:58457
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:70354
社区版块
存档分类
最新评论

Apache Pig如何自定义UDF函数?

    博客分类:
  • Pig
阅读更多
近日由于工作所需,需要使用到Pig来分析线上的搜索日志数据,散仙本打算使用hive来分析的,但由于种种原因,没有用成,而Pig(pig0.12-cdh)散仙一直没有接触过,所以只能临阵磨枪了,花了两天时间,大致看完了pig官网的文档,在看文档期间,也是边实战边学习,这样以来,对pig的学习,会更加容易,当然本篇不是介绍如何快速学好一门框架或语言的文章,正如标题所示,散仙打算介绍下如何在Pig中,使用用户自定义的UDF函数,关于学习经验,散仙会在后面的文章里介绍。



一旦你学会了UDF的使用,就意味着,你可以以更加灵活的方式来使用Pig,使它扩展一些为我们的业务场景定制的特殊功能,而这些功能,在通用的pig里是没有的,举个例子:

你从HDFS上读取的数据格式,如果使用默认的PigStorage()来加载,存储可能只支持有限的数据编码和类型,如果我们定义了一种特殊的编码存储或序列化方式,那么当我们使用默认的Pig来加载的时候,就会发现加载不了,这时候我们的UDF就派上用场了,我们只需要自定义一个LoadFunction和一个StoreFunction就可以解决,这种问题。


本篇散仙根据官方文档的例子,来实战一下,并在hadoop集群上使用Pig测试通过:
我们先来看下定义一个UDF扩展类,需要几个步骤:
序号步骤说明
1在eclipse里新建一个java工程,并导入pig的核心包java项目
2新建一个包,继承特定的接口或类,重写自定义部分核心业务
3编写完成后,使用ant打包成jar编译时需要pig依赖,但不用把pig的jar包打入UDF中
4把打包完成后的jar上传到HDFS上pig运行时候需要加载使用
5在pig脚本里,注册我们自定义的udf的jar包注入运行时环境
6编写我们的核心业务pig脚本运行测试是否运行成功


项目工程截图如下:





核心代码如下:
package com.pigudf;

import java.io.IOException;

import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
import org.apache.pig.impl.util.WrappedIOException;
/**
 * 自定义UDF类,对字符串转换大写
 * @author qindongliang
 * */
public class MyUDF extends EvalFunc<String> {

	@Override
	public String exec(Tuple input) throws IOException {
		
		 //判断是否为null或空,就跳过
		if(input==null||input.size()==0){
			return null;
		}
		try{
			//获取第一个元素
			String str=(String) input.get(0);
			//转成大写返回
			return str.toUpperCase();
			
		}catch(Exception e){
			throw WrappedIOException.wrap("Caught exception processing input row ",e);
		}
	}
	

}


关于打包的ant脚本,散仙会在文末上传附件,下面看下造的一些测试数据(注意,文件一定要上传到HDFS上,除非你是local模式):
grunt> cat s.txt
zhang san,12
Song,34
long,34
abC,12
grunt> 



我们在看下,操作文件和jar包是放在一起的:
grunt> ls
hdfs://dnode1:8020/tmp/udf/pudf.jar<r 3>        1295
hdfs://dnode1:8020/tmp/udf/s.txt<r 3>   36
grunt> 


最后,我们看下pig脚本的定义:
--注册自定义的jar包
REGISTER pudf.jar; 
--加载测试文件的数据,逗号作为分隔符
a = load 's.txt' using PigStorage(',');   
--遍历数据,对name列转成大写
b =  foreach a generate com.pigudf.MyUDF((chararray)$0); 
--启动MapReduce的Job进行数据分析
dump b

最后,我们看下结果,只要过程不出现异常和任务失败,就证明我们的udf使用成功:

Counters:
Total records written : 4
Total bytes written : 64
Spillable Memory Manager spill count : 0
Total bags proactively spilled: 0
Total records proactively spilled: 0

Job DAG:
job_1419419533357_0147


2014-12-30 18:10:24,394 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Success!
2014-12-30 18:10:24,395 [main] INFO  org.apache.hadoop.conf.Configuration.deprecation - fs.default.name is deprecated. Instead, use fs.defaultFS
2014-12-30 18:10:24,396 [main] INFO  org.apache.pig.data.SchemaTupleBackend - Key [pig.schematuple] was not set... will not generate code.
2014-12-30 18:10:24,405 [main] INFO  org.apache.hadoop.mapreduce.lib.input.FileInputFormat - Total input paths to process : 1
2014-12-30 18:10:24,405 [main] INFO  org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths to process : 1
(ZHANG SAN,12)
(SONG,34)
(LONG,34)
(ABC,12)

结果没问题,我们的UDF加载执行成功,如果我们还想将我们的输出结果直接写入到HDFS上,可以在pig脚本的末尾,去掉dump命令,加入
store e into '/tmp/dongliang/result/'; 将结果存储到HDFS上,当然我们可以自定义存储函数,将结果写入数据库,Lucene,Hbase等关系型或一些NOSQL数据库里。





欢迎大家关注微信公众号:我是工程师(woshigcs),更多与攻城师息息相关的内容,尽在此处。
二维码扫描:




  • 大小: 83.9 KB
2
1
分享到:
评论

相关推荐

    apache pig 基础及应用

    apache pig 基础及应用,urldecode row_number web日志分析 根据 用户行为 做出 简易的 相似度 判断。

    基于REST接口的PIG的oink.zip

    Oink 是基于 Servlet 的 Pig ,提供以下功能:注册/注销/查看 Pig 脚本注册/注销/查看 jar 文件 (用于自定义 UDF 函数)执行 Pig 工作查看 Pig 工作的数据/状态取消一个 Pig 工作 标签:oink

    pig-json:用于 Apache Pig 的 Mortar JSON 工具

    JsonLoader :用于任意 JSON 文件的 Pig 加载函数(不仅仅是 JsonStorage 生成的文件) FromJsonInferSchema :包装 JsonLoader 以将字符数组(字符串)字段中的 JSON 转换为 Map 的 Pig UDF。 推断输出的模式。 ...

    PigExtend:Apache Pig+MapReduce给LuceneSolrElasticSearch构建索引

    这个框架里面通过Pig的UDF函数封装了Store方法,只要Pig能读的任何数据源,我们都可以通过Store函数,将结果轻而易举的存储到我们的索引里面, ####使用步骤 (1)下载源码后,根据自己的业务情况,稍作修改,然后...

    jpmml-pig:Apache Pig 平台的 PMML 评估器库(旧代码库)

    JPMML-猪 Apache Pig 平台 ( ) 的 PMML 评估器库。 特征 完全支持 PMML 规范版本 3.0 到 4.2。... 模型启动器类必须扩展抽象 Pig 用户定义函数 (UDF) 类org.apache.pig.EvalFunc并为以下方法提供具体实现: #exec(T

    SeqPig:使用 Apache Pig 处理大型测序数据集!-开源

    它为测序数据常用的文件格式提供导入和导出功能,以及一组 Pig 用户定义函数 (UDF),以帮助处理对齐和未对齐的序列数据。 目前 SeqPig 支持 BAM/SAM、FastQ 和 Qseq 输入和输出。 有关更多信息,请参阅 ...

    pig-hyperloglog:一个用于计算和使用 HyperLogLog 算法的猪 udf

    猪超级日志几个用户定义函数 (UDF) 来计算和使用 HyperLogLog 算法。 存在其他实现(例如, )。 该项目的实施是为了补充并使用完全相同的实现。 因此,它使您能够在猪脚本中计算 HLL 字符串,将结果导入 MySQL,...

    Hadoop权威指南(中文版)2015上传.rar

    用户自定义函数 过滤UDF 计算UDF 加载UDF 数据处理操作 加载和存储数据 过滤数据 分组与连接数据 对数据进行排序 组合和分割数据 Pig实战 并行处理 参数代换 第12章 Hive 1.1 安装Hive 1.1.1 Hive外壳环境 1.2 示例 ...

    Hadoop权威指南 第二版(中文版)

     用户自定义函数  过滤UDF  计算UDF  加载UDF  数据处理操作  加载和存储数据  过滤数据  分组与连接数据  对数据进行排序  组合和分割数据  Pig实战  并行处理  参数代换 第12章 Hive  1.1 安装Hive ...

    Hadoop硬实战 [(美)霍姆斯著][电子工业出版社][2015.01]_PDF电子书下载 带书签目录 高清完整版.rar )

    3.4 自定义文件格式 3.4.1 输入输出格式 技术点18 输入和输出格式为CSV 的文件 3.4.2 output committing 的重要性 3.5 本章小结 第3 部分 大数据模式 4 处理大数据的MapReduce 模式 4.1 Join ...

    Hadoop实战(第2版)

    11.2.1 加载数据技术点67 加载Apache 日志文件11.2.2 过滤和投影技术点68 通过过滤和投影减少数据处理量11.2.3 分组和聚合UDF 技术点69 IP 地址的分组和计数 11.2.4 使用UDF 进行定位技术点70 使用...

Global site tag (gtag.js) - Google Analytics