近日由于工作所需,需要使用到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脚本运行 测试是否运行成功

项目工程截图如下:

核心代码如下:

  1. package com.pigudf;
  2. import java.io.IOException;
  3. import org.apache.pig.EvalFunc;
  4. import org.apache.pig.data.Tuple;
  5. import org.apache.pig.impl.util.WrappedIOException;
  6. /**
  7. * 自定义UDF类,对字符串转换大写
  8. * @author qindongliang
  9. * */
  10. public class MyUDF extends EvalFunc<String> {
  11. @Override
  12. public String exec(Tuple input) throws IOException {
  13. //判断是否为null或空,就跳过
  14. if(input==null||input.size()==0){
  15. return null;
  16. }
  17. try{
  18. //获取第一个元素
  19. String str=(String) input.get(0);
  20. //转成大写返回
  21. return str.toUpperCase();
  22. }catch(Exception e){
  23. throw WrappedIOException.wrap("Caught exception processing input row ",e);
  24. }
  25. }
  26. }

关于打包的ant脚本,散仙会在文末上传附件,下面看下造的一些测试数据(注意,文件一定要上传到HDFS上,除非你是local模式):

  1. grunt> cat s.txt
  2. zhang san,12
  3. Song,34
  4. long,34
  5. abC,12
  6. grunt>

我们在看下,操作文件和jar包是放在一起的:

  1. grunt> ls
  2. hdfs://dnode1:8020/tmp/udf/pudf.jar<r 3>        1295
  3. hdfs://dnode1:8020/tmp/udf/s.txt<r 3>   36
  4. grunt>

最后,我们看下pig脚本的定义:

  1. --注册自定义的jar包
  2. REGISTER pudf.jar;
  3. --加载测试文件的数据,逗号作为分隔符
  4. a = load 's.txt' using PigStorage(',');
  5. --遍历数据,对name列转成大写
  6. b =  foreach a generate com.pigudf.MyUDF((chararray)$0);
  7. --启动MapReduce的Job进行数据分析
  8. dump b

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

  1. Counters:
  2. Total records written : 4
  3. Total bytes written : 64
  4. Spillable Memory Manager spill count : 0
  5. Total bags proactively spilled: 0
  6. Total records proactively spilled: 0
  7. Job DAG:
  8. job_1419419533357_0147
  9. 2014-12-30 18:10:24,394 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Success!
  10. 2014-12-30 18:10:24,395 [main] INFO  org.apache.hadoop.conf.Configuration.deprecation - fs.default.name is deprecated. Instead, use fs.defaultFS
  11. 2014-12-30 18:10:24,396 [main] INFO  org.apache.pig.data.SchemaTupleBackend - Key [pig.schematuple] was not set... will not generate code.
  12. 2014-12-30 18:10:24,405 [main] INFO  org.apache.hadoop.mapreduce.lib.input.FileInputFormat - Total input paths to process : 1
  13. 2014-12-30 18:10:24,405 [main] INFO  org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths to process : 1
  14. (ZHANG SAN,12)
  15. (SONG,34)
  16. (LONG,34)
  17. (ABC,12)

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

如何给Apache Pig自定义UDF函数?的更多相关文章

  1. 自定义UDF函数应用异常

    自定义UDF函数应用异常 版权声明:本文为yunshuxueyuan原创文章.如需转载请标明出处: http://www.cnblogs.com/sxt-zkys/QQ技术交流群:299142667 ...

  2. pig 自定义udf中读取hdfs 文件

    最近几天,在研究怎么样把日志中的IP地址转化成具体省份城市. 希望写一个pig udf IP数据库采用的纯真IP数据库文件qqwry.dat,可以从http://www.cz88.net/下载. 这里 ...

  3. 047 SparkSQL自定义UDF函数

    一:程序部分 1.需求 Double数据类型格式化,可以给定小数点位数 2.程序 package com.scala.it import org.apache.spark.{SparkConf, Sp ...

  4. Hive与MapReduce相关排序及自定义UDF函数

    原文链接: https://www.toutiao.com/i6770870821809291788/ Hive和mapreduce相关的排序和运行的参数 1.设置每个reduce处理的数据量(单位是 ...

  5. 玩转大数据系列之Apache Pig高级技能之函数编程(六)

    原创不易,转载请务必注明,原创地址,谢谢配合! http://qindongliang.iteye.com/ Pig系列的学习文档,希望对大家有用,感谢关注散仙! Apache Pig的前世今生 Ap ...

  6. Spark注册UDF函数,用于DataFrame DSL or SQL

    import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions._ object Test2 { def ...

  7. 自定义Hive函数

    7. 函数 7.1 系统内置函数 查看系统自带的函数:show functions; 显示自带的函数的用法:desc function upper(函数名); 详细显示自带的函数的用法:desc fu ...

  8. 玩转大数据系列之Apache Pig如何与Apache Solr集成(二)

    散仙,在上篇文章中介绍了,如何使用Apache Pig与Lucene集成,还不知道的道友们,可以先看下上篇,熟悉下具体的流程. 在与Lucene集成过程中,我们发现最终还要把生成的Lucene索引,拷 ...

  9. 自定义udf添加一列

    //创建得分窗口字典 var dict= new mutable.HashMap[Double, Int]() ){ dict.put(result_Score(i),i) } //自定义Udf函数 ...

随机推荐

  1. python库之sklearn

     一.安装sklearn conda install scikit-learn 参考文献 [1]整体介绍sklearn https://blog.csdn.net/u014248127/article ...

  2. 【转载】浅谈Linux内存管理机制

    经常遇到一些刚接触Linux的新手会问内存占用怎么那么多? 在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在 ...

  3. 那些年,我们见过的 Java 服务端“问题”

    导读 明代著名的心学集大成者王阳明先生在<传习录>中有云: 道无精粗,人之所见有精粗.如这一间房,人初进来,只见一个大规模如此.处久,便柱壁之类,一一看得明白.再久,如柱上有些文藻,细细都 ...

  4. 阿里云 Aliplayer高级功能介绍(二):缩略图

    基本介绍 Aliplayer提供了缩略图的功能,让用户在拖动进度条之前知道视频的内容,用户能够得到很好的播放体验,缩略图是显示在Controlbar的上面,并且包含当前的时间,阿里云的媒体处理服务提供 ...

  5. 自定义Collection View布局

    转自answer-huang的博客 原文出自:Custom Collection View Layouts    UICollectionView在iOS6中第一次被介绍,也是UIKit视图类中的一颗 ...

  6. 样本方差的抽样分布 χ2(n) 卡方分布_样本方差 卡方分布

    样本方差的抽样分布 χ2(n) 卡方分布_样本方差 卡方分布 样本方差的抽样分布 χ2(n) 卡方分布 t分布.卡方分布.f分布均要求总体服从正态分布. 若n个相互独立的随机变量ξ1,ξ2,-,ξn ...

  7. fastjson 过滤不需要序列化的属性

    JSON JSON英文全称为JavaScriptObject Natation,采用key:value键值对的方式存贮数据,与xml格式相比,JSON是一种轻量级的数据交换格式:不要被JavaScri ...

  8. UVA-108-Maximum Sum-子矩阵最大和(最大连续子序列的变形)+降维处理+dp

    A problem that is simple to solve in one dimension is often much more difficult to solve in more tha ...

  9. 一个因为系统字号设置导致的rem计算渲染异常问题

    测试同学突然拿着一部手机过来说,H5渲染各个元素都变大了,有些元素撑出了屏幕外面. 本来以为是某个Webview的渲染兼容问题,结果发现所有的浏览器都这样. 莫名其妙,隐约感觉是 rem计算出了问题, ...

  10. PAT甲级——A1108 Finding Average【20】

    The basic task is simple: given N real numbers, you are supposed to calculate their average. But wha ...