转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