近日由于工作所需,需要使用到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
分享到:
相关推荐
在大数据处理领域,Apache Pig 是一个非常重要的工具,它提供了一种高级的脚本语言(Pig Latin)来处理大规模数据集。用户定义的函数(User Defined Functions, UDFs)是 Pig 功能的重要组成部分,允许用户扩展其...
apache pig 基础及应用,urldecode row_number web日志分析 根据 用户行为 做出 简易的 相似度 判断。
根据给定的文件信息,我们可以深入探讨Apache Pig的性能优化及其在大数据处理中的角色与优势。首先,让我们从Apache Pig的基本概念入手。 ### Apache Pig概述 Apache Pig是一种高生产力的数据流语言和执行框架,...
UDF(User Defined Functions)是Pig的一个核心特性,允许用户自定义函数来扩展其内置功能。在这个名为“pig-udf:猪用UDF样本”的项目中,我们主要关注的是如何使用Java来编写和集成自定义的UDF到Pig的处理流程中。...
Oink 是基于 Servlet 的 Pig ,提供以下功能:注册/注销/查看 Pig 脚本注册/注销/查看 jar 文件 (用于自定义 UDF 函数)执行 Pig 工作查看 Pig 工作的数据/状态取消一个 Pig 工作 标签:oink
用户可以通过 Grunt Shell、自定义用户定义函数 (UDFs) 或嵌入式方式执行这些脚本。在 MapReduce 层面,Pig Latin 操作被转换成一系列任务,这些任务在 Hadoop 集群中并行执行,从而实现高效的分布式计算。 Apache ...
Pig Latin本身提供的函数可能无法满足所有需求,这时就可以编写自定义的Java函数并集成到Pig作业中。UDF可以用于执行数据清洗、计算、字符串操作等任务,极大地丰富了Pig的数据处理能力。编写UDF时,需要继承Pig的...
这包括编写自定义Pig UDF(用户定义函数)以及使用Java API来构建Storm拓扑。 在"apache-pig-on-storm-master"这个压缩包中,我们可以期待找到一个示例项目或库,它可能包含了以下内容: 1. **Pig Latin脚本**:...
JsonLoader :用于任意 JSON 文件的 Pig 加载函数(不仅仅是 JsonStorage 生成的文件) FromJsonInferSchema :包装 JsonLoader 以将字符数组(字符串)字段中的 JSON 转换为 Map 的 Pig UDF。 推断输出的模式。 ...
这个框架里面通过Pig的UDF函数封装了Store方法,只要Pig能读的任何数据源,我们都可以通过Store函数,将结果轻而易举的存储到我们的索引里面, ####使用步骤 (1)下载源码后,根据自己的业务情况,稍作修改,然后...
1. **用户定义函数 (UDF)**:Pig 提供了 UDF 机制,允许用户编写自定义 Java 函数来处理数据,扩展其内建操作集。 2. **Pig Latin**:Pig 的编程语言称为 Pig Latin,是一种声明式语言,用于定义数据处理逻辑,UDF ...
用户定义的函数(UDF)是Pig Latin中的一个重要组成部分,允许开发者自定义处理逻辑,以处理Pig无法内置处理的复杂数据转换或业务规则。PDI Bridge使得PDI的转换和步骤可以作为Pig的UDF使用,从而扩展了Pig的数据...
Pig支持用户自定义函数,以扩展其功能。源码中,UDF的注册、调用及执行流程清晰可见。这包括了对Java和Python UDF的支持,以及如何将UDF集成到Pig Latin语句中进行数据转换和处理。 3. **数据类型和Schema**: 在...
JPMML-猪 Apache Pig 平台 ( ) 的 PMML 评估器库。 特征 完全支持 PMML 规范版本 3.0 到 4.2。... 模型启动器类必须扩展抽象 Pig 用户定义函数 (UDF) 类org.apache.pig.EvalFunc并为以下方法提供具体实现: #exec(T
5. **用户定义函数(UDF)**:Pig 支持用户编写自己的 Java 或 Scala 函数,以扩展其内置的功能。这些 UDF 可以用于处理特定的数据类型、执行复杂的计算或集成自定义的算法。 6. **调试和日志**:Pig 提供了详细的...
此外,书中还会涉及Pig的UDF(用户定义函数),这是Pig的强大特性之一。用户可以编写自定义Java函数来扩展Pig的功能,处理更复杂的数据转换和计算。UDFs分为两种类型:Eval Functions用于生成新的字段,而Load/Store...
3. **UDF(用户定义函数)扩展**:0.7.0版本提供了更多的内置UDF,同时也支持用户自定义UDF,这极大地增强了Pig的功能性和灵活性。用户可以通过编写Java代码或使用其他语言(如Python或JavaScript)来扩展Pig的功能...
通过Java API,开发者可以直接与Pig交互,创建自定义函数(UDF)来扩展Pig的功能,满足特定的数据处理需求。 2. **pigunit.jar**: `pigunit.jar`是Pig的单元测试框架,它允许开发人员对Pig Latin脚本进行自动化...
同时,Pig还支持自定义函数(UDF),源码包中的FuncSpec和GenericUDF接口展示了如何扩展Pig的功能。 5. 执行模型:Pig的执行模型基于Hadoop,它将Pig Latin脚本转化为一系列的MapReduce作业。源码中,Executor和...
此外,Pig还支持用户自定义函数(UDF),这使得Pig可以扩展使用Java、Python、JavaScript等其他语言编写的函数,从而执行更复杂的数据处理任务。这为Pig提供了极大的灵活性和强大的处理能力。 最后,由于Pig与...