初学编程的人,都知道hello world的含义,当你第一次从控制台里打印出了hello world,就意味着,你已经开始步入了编程的大千世界,这和第一个吃螃蟹的人的意义有点相似,虽然这样比喻并不恰当。
若是说学会了使用hello world就表明着你踏入了单机编程的大门,那么学会在分布式环境下使用wordcount,则意味着你踏入了分布式编程的大门。试想一下,你的程序可以成百上千台机器的集群中运行,是否是一件颇有记念意义的事情呢?无论在Hadoop中,仍是Spark中,初次学习这两个开源框架作的第一个例子无疑于wordcount了,只要咱们的wordcount可以运行成功,那么咱们就能够大胆的向后深刻探究了。
扯多了,下面赶忙进入正题,看一下,如何使用5行代码来实现hadoop的wordcount,在Hadoop中若是使用Java写一个wordcount最少也得几十行代码,若是经过Hadoop Streaming的方式采用Python,PHP,或C++来写,差很少也得10行代码左右。若是是基于Spark的方式来操做HDFS,在采用Scala语言,来写wordcount,5行代码也能搞定,可是若是使用spark,基于Java的api来写,那么就臃肿了,没有几十行代码,也是搞不定的。
今天,散仙在这里既不采用spark的scala来写,也不采用hadoop streaming的python方式来写,看看如何使用咱们的Pig脚本,来搞定这件事,测试数据以下:
python
i am hadoop sql
i am hadoop 编程
i am lucene api
i am hbase 微信
i am hive 框架
i am hive sql 分布式
i am pig ide
Pig的所有脚本以下:
工具
--大数据交流群:376932160(广告勿入)
--load文本的txt数据,并把每行做为一个文本
a = load '$in' as (f1:chararray);
--将每行数据,按指定的分隔符(这里使用的是空格)进行分割,并转为扁平结构
b = foreach a generate flatten(TOKENIZE(f1, ' '));
--对单词分组
c = group b by $0;
--统计每一个单词出现的次数
d = foreach c generate group ,COUNT($1);
--存储结果数据
stroe d into '$out'
处理结果以下:
(i,7)
(am,7)
(pig,1)
(sql,1)
(hive,2)
(hbase,1)
(hadoop,2)
(lucene,1)
是的,你没看错,就是5行代码,实现了数据的读取,分割,转换,分组,统计,存储等功能。很是简洁方便!
除了spark以外,没有比这更简洁的,但这仅仅只是一个做业而已,若是在需求里面,又加入了对结果排序,取topN,这时候在pig里面,仍是很是简单,只需新加2行代码便可,可是在spark里面,可能就须要数行代码了。
咱们看下,更改以后的pig代码,加入了排序,取topN的功能:
--load文本的txt数据,并把每行做为一个文本
a = load '$in' as (f1:chararray);
--将每行数据,按指定的分隔符(这里使用的是空格)进行分割,并转为扁平结构
b = foreach a generate flatten(TOKENIZE(f1, ' '));
--对单词分组
c = group b by $0;
--统计每一个单词出现的次数
d = foreach c generate group ,COUNT($1);
-- 按统计次数降序
e = order d by $1 desc;
--取top2
f = limit e 2;
--存储结果数据
stroe f into '$out'
输出结果以下:
(i,7)
(am,7)
若是使用JAVA来编写这个MapReduce做业,后面的排序统计topn,必须得从新写一个job来执行,由于MapReduce干的事很是简单,一个job仅仅只处理一个功能,而在Pig中它会自动,帮咱们分析语法树来构建多个依赖的MapReduce做业,而咱们无须关心底层的代码实现,只需专一咱们的业务便可。
除此以外,Pig仍是一个很是灵活的批处理框架,经过自定义UDF模块,咱们可使用Pig来干不少事,看过散仙的上一篇文章的朋友们,应该就知道当初雅虎公司不只仅使用Pig分析日志,搜索内容,PangeRank排名,并且还使用Pig来构建它们的web倒排索引等种种扩展功能,咱们均可以经过Pig的UDF的方式来实现,它能够将咱们的业务与MapReduce具体的实现解耦,并且复用性极强,咱们写的任何一个工具类,均可以垂手可得的经过Pig稳定的运行在大规模的Hadoop集群之上。
扫码关注微信公众号:我是攻城师(woshigcs),若是有什么疑问,技术问题,职业问题等,欢迎在公众号上留言与我探讨!让咱们作不同的攻城师!谢谢你们!
转载请注明原创地址,谢谢配合!http://qindongliang.iteye.com/