Pig语言

转http://www.chinacloud.cn/show.aspx?id=59&cid=12

 

Pig 是yahoo捐献给apache的一个项目,目前还在Apache孵化器中,但是基本功能已经可用了.今天我就给大家介绍这个好用的Pig.Pig是SQL-like语言 ,是在MapReduce上构建的一种高级查询语言,把一些运算编译进MapReduce模型的Map和Reduce中,并且用户可以定义自己的功能.Yahoo网格运算部门开发的又一个克隆Google的项目:Sawzall .

支持的运算
算数符号:+,-,*,/
多种数据类型:string,int,float,long等
比较运算:==, !=, >, >=, <, <=,eq, neq, gt, gte, lt,lte,matches
复杂的数据类型:bag,tuple,map
相关运算:FILTER,GROUP BY,ORDER,DISTINCT,UNION,JOIN,FOREACH ... GENERATE
数据统计:COUNT,SUM,AVG,MIN,MAX等。

 

pig支持的原始类型数据:int,long,float,double,char数组,byte数组

pig内部的数据类型:
bag:一个tuple的集合,表示方式:{<1,2>,<3,4>}
tuple:一个排序的数组,表示方式:<pig,3.14>
map:一个key,value的map数据,表示方式:['pig':<'load','store'>,'web':'hadoop.apache.org']
atom:单一的原始类型数据,作为string存储,也能转化成数值类型.表示方式:'apache.org'或'2.3'.

数据表示方式:

t = < 1, {<2,3>,<4,6>,<5,7>}, ['apache':'hadoop']>

在上面的例子中一个tuple被引用到t下,因此t有3个域f1,f2,f3,我们可以通过t.f1或t.$0访问到1,通过t.f2或t.$1访 问到{<2,3>,<4,6>,<5,7>},通过t.f3或t.$2访问到 ['apache':'hadoop'].

pig可以以local的方式或cluster的方式运行.下面我们还是以处理apache的日志文件开始我们的pig脚本例子来解释pig语言. 我们的日志(access.log)包含许多日的访问日志,我们需要知道在2007年1月30日每一个ip每小时访问页面多少次.在运行程序以前请保证你 运行在java 1.5以上版本,并下载例子文件 .

local方式(仅支持非windows系统):
请把hadoop-site.xml文件删除.运行:

java -cp .:pig.jar org.apache.pig.Main -x local log.pig

cluster的方式(支持windows系统):
保证你的Hadoop的集群版本是0.17.0,修改hadoop-site.xml中的fs.default.name,mapred.job.tracker,mapred.system.dir中的值,使这些值和cluster相同.

java -cp .:pig.jar org.apache.pig.Main log.pig

查看结果:

cat logs/20070130;

脚本解释:

使用Hadoop的copyFromLocal命令拷贝access.log到HDFS

copyFromLocal access.log access.log;

注册包含用户定义功能(UDFs)的jar文件

REGISTER udfs.jar;

设定mapreduce工作名称

set job.name 'hadoop.org.cn log parser';

使用用户定义功能装载log文件

in = LOAD 'access.log' USING  cn.org.hadoop.pig.storage.LogStorage();

因为在NSCA log格式中日期格式是"21/Jan/2007:15:29:24 +0800",所以转换成20070121152924格式

gen = FOREACH in GENERATE $0,cn.org.hadoop.pig.time.FormatTime($1),*;

过滤掉非正常的行。

result = FILTER gen BY (NOT IsEmpty($1));

存储结果到HDFS用户的temp目录中

STORE result INTO 'temp';

重新设定mapreduce工作名称

set job.name 'hadoop.org.cn filter parser';

使用默认的功能(PigStorage)装载temp目录中的文件

A = LOAD 'temp' AS (ip,date,method,url,protocol,code,bytes);

提取出日期为2007-01-30日的结果集

B = FILTER A BY (date MATCHES '20070130.*');

因为我们仅仅关心每个小时的结果,所以我们调用用户定义功能ExtractTime,提取一天中的小时

C = FOREACH B GENERATE ip,cn.org.hadoop.pig.time.ExtractTime(date,'8','10') as hour;

使用GROUP功能

D = GROUP C BY (ip,hour);

计算每一个ip每小时访问页面多少次

E = FOREACH D GENERATE flatten($0),COUNT($1);

按小时降序排列

F = ORDER E BY $1 USING cn.org.hadoop.pig.sort.Desc;

存储结果到目录

STORE F INTO 'logs/20070130';

在压缩包的udfs.jar文件中包含源码,压缩包还包含vm下Pig语言高亮的pig.vim代码
pig.vim安装方法:
1.拷贝 pig.vim到~/.vim/syntax/目录下
2. 编辑~/.vimrc 添加下面的行:
augroup filetypedetect
au BufNewFile,BufRead *.pig set filetype=pig syntax=pig
augroup END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值