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

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
分享到:
评论

相关推荐

    pig udf 函数(urldecode row_number tomap)

    在大数据处理领域,Apache Pig 是一个非常重要的工具,它提供了一种高级的脚本语言(Pig Latin)来处理大规模数据集。用户定义的函数(User Defined Functions, UDFs)是 Pig 功能的重要组成部分,允许用户扩展其...

    apache pig 基础及应用

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

    Apache Pig的性能优化.pdf

    根据给定的文件信息,我们可以深入探讨Apache Pig的性能优化及其在大数据处理中的角色与优势。首先,让我们从Apache Pig的基本概念入手。 ### Apache Pig概述 Apache Pig是一种高生产力的数据流语言和执行框架,...

    pig-udf:猪用UDF样本

    UDF(User Defined Functions)是Pig的一个核心特性,允许用户自定义函数来扩展其内置功能。在这个名为“pig-udf:猪用UDF样本”的项目中,我们主要关注的是如何使用Java来编写和集成自定义的UDF到Pig的处理流程中。...

    基于REST接口的PIG的oink.zip

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

    Apache Hadoop---Pig.docx

    用户可以通过 Grunt Shell、自定义用户定义函数 (UDFs) 或嵌入式方式执行这些脚本。在 MapReduce 层面,Pig Latin 操作被转换成一系列任务,这些任务在 Hadoop 集群中并行执行,从而实现高效的分布式计算。 Apache ...

    pig编程指南中的样例脚本、UDF、数据集

    Pig Latin本身提供的函数可能无法满足所有需求,这时就可以编写自定义的Java函数并集成到Pig作业中。UDF可以用于执行数据清洗、计算、字符串操作等任务,极大地丰富了Pig的数据处理能力。编写UDF时,需要继承Pig的...

    apache-pig-on-storm:使用Apache Pig的Pig Latin生成并运行Apache Storm拓扑

    这包括编写自定义Pig UDF(用户定义函数)以及使用Java API来构建Storm拓扑。 在"apache-pig-on-storm-master"这个压缩包中,我们可以期待找到一个示例项目或库,它可能包含了以下内容: 1. **Pig Latin脚本**:...

    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)下载源码后,根据自己的业务情况,稍作修改,然后...

    pdi-pig-udfs:使用 Pentaho 数据集成的 Pig UDF 的集合

    1. **用户定义函数 (UDF)**:Pig 提供了 UDF 机制,允许用户编写自定义 Java 函数来处理数据,扩展其内建操作集。 2. **Pig Latin**:Pig 的编程语言称为 Pig Latin,是一种声明式语言,用于定义数据处理逻辑,UDF ...

    pdi-bridge:一个项目,允许您轻松地将 Pentaho Data Integration 集成到您的应用程序中。 适用于 Pig UDF、Spark 函数等

    用户定义的函数(UDF)是Pig Latin中的一个重要组成部分,允许开发者自定义处理逻辑,以处理Pig无法内置处理的复杂数据转换或业务规则。PDI Bridge使得PDI的转换和步骤可以作为Pig的UDF使用,从而扩展了Pig的数据...

    pig源码0.15版

    Pig支持用户自定义函数,以扩展其功能。源码中,UDF的注册、调用及执行流程清晰可见。这包括了对Java和Python UDF的支持,以及如何将UDF集成到Pig Latin语句中进行数据转换和处理。 3. **数据类型和Schema**: 在...

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

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

    pig-0.12.0-cdh5.5.0.tar.gz

    5. **用户定义函数(UDF)**:Pig 支持用户编写自己的 Java 或 Scala 函数,以扩展其内置的功能。这些 UDF 可以用于处理特定的数据类型、执行复杂的计算或集成自定义的算法。 6. **调试和日志**:Pig 提供了详细的...

    Pig编程指南

    此外,书中还会涉及Pig的UDF(用户定义函数),这是Pig的强大特性之一。用户可以编写自定义Java函数来扩展Pig的功能,处理更复杂的数据转换和计算。UDFs分为两种类型:Eval Functions用于生成新的字段,而Load/Store...

    pig-0.7.0.tar.gz

    3. **UDF(用户定义函数)扩展**:0.7.0版本提供了更多的内置UDF,同时也支持用户自定义UDF,这极大地增强了Pig的功能性和灵活性。用户可以通过编写Java代码或使用其他语言(如Python或JavaScript)来扩展Pig的功能...

    pig java 编程jar包

    通过Java API,开发者可以直接与Pig交互,创建自定义函数(UDF)来扩展Pig的功能,满足特定的数据处理需求。 2. **pigunit.jar**: `pigunit.jar`是Pig的单元测试框架,它允许开发人员对Pig Latin脚本进行自动化...

    pig的源码包

    同时,Pig还支持自定义函数(UDF),源码包中的FuncSpec和GenericUDF接口展示了如何扩展Pig的功能。 5. 执行模型:Pig的执行模型基于Hadoop,它将Pig Latin脚本转化为一系列的MapReduce作业。源码中,Executor和...

    Programming Pig(pig编程).pdf

    此外,Pig还支持用户自定义函数(UDF),这使得Pig可以扩展使用Java、Python、JavaScript等其他语言编写的函数,从而执行更复杂的数据处理任务。这为Pig提供了极大的灵活性和强大的处理能力。 最后,由于Pig与...

Global site tag (gtag.js) - Google Analytics