5行代码怎么实现Hadoop的WordCount?

初学编程的人,都知道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

Java代码  收藏代码web

  1. i am hadoop  sql

  2. i am hadoop  编程

  3. i am lucene  api

  4. i am hbase  微信

  5. i am hive  框架

  6. i am hive sql  分布式

  7. i am pig  ide


Pig的所有脚本以下: 
工具

Pig代码  收藏代码

  1. --大数据交流群:376932160(广告勿入)  

  2. --load文本的txt数据,并把每行做为一个文本  

  3. a = load '$in' as (f1:chararray);  

  4. --将每行数据,按指定的分隔符(这里使用的是空格)进行分割,并转为扁平结构  

  5. b = foreach a generate flatten(TOKENIZE(f1, ' '));  

  6. --对单词分组  

  7. c = group b by $0;  

  8. --统计每一个单词出现的次数  

  9. d = foreach c generate group ,COUNT($1);  

  10. --存储结果数据  

  11. stroe d into '$out'  


处理结果以下: 

Java代码  收藏代码

  1. (i,7)  

  2. (am,7)  

  3. (pig,1)  

  4. (sql,1)  

  5. (hive,2)  

  6. (hbase,1)  

  7. (hadoop,2)  

  8. (lucene,1)  


是的,你没看错,就是5行代码,实现了数据的读取,分割,转换,分组,统计,存储等功能。很是简洁方便! 

除了spark以外,没有比这更简洁的,但这仅仅只是一个做业而已,若是在需求里面,又加入了对结果排序,取topN,这时候在pig里面,仍是很是简单,只需新加2行代码便可,可是在spark里面,可能就须要数行代码了。 

咱们看下,更改以后的pig代码,加入了排序,取topN的功能: 

Pig代码  收藏代码

  1. --load文本的txt数据,并把每行做为一个文本  

  2. a = load '$in' as (f1:chararray);  

  3. --将每行数据,按指定的分隔符(这里使用的是空格)进行分割,并转为扁平结构  

  4. b = foreach a generate flatten(TOKENIZE(f1, ' '));  

  5. --对单词分组  

  6. c = group b by $0;  

  7. --统计每一个单词出现的次数  

  8. d = foreach c generate group ,COUNT($1);  

  9. -- 按统计次数降序  

  10. e = order d by $1 desc;  

  11. --取top2  

  12. f = limit e 2;  

  13. --存储结果数据  

  14. stroe f into '$out'  


输出结果以下: 

Java代码  收藏代码

  1. (i,7)  

  2. (am,7)  



若是使用JAVA来编写这个MapReduce做业,后面的排序统计topn,必须得从新写一个job来执行,由于MapReduce干的事很是简单,一个job仅仅只处理一个功能,而在Pig中它会自动,帮咱们分析语法树来构建多个依赖的MapReduce做业,而咱们无须关心底层的代码实现,只需专一咱们的业务便可。 

除此以外,Pig仍是一个很是灵活的批处理框架,经过自定义UDF模块,咱们可使用Pig来干不少事,看过散仙的上一篇文章的朋友们,应该就知道当初雅虎公司不只仅使用Pig分析日志,搜索内容,PangeRank排名,并且还使用Pig来构建它们的web倒排索引等种种扩展功能,咱们均可以经过Pig的UDF的方式来实现,它能够将咱们的业务与MapReduce具体的实现解耦,并且复用性极强,咱们写的任何一个工具类,均可以垂手可得的经过Pig稳定的运行在大规模的Hadoop集群之上。 




扫码关注微信公众号:我是攻城师(woshigcs),若是有什么疑问,技术问题,职业问题等,欢迎在公众号上留言与我探讨!让咱们作不同的攻城师!谢谢你们!  

3214000f-5633-3c17-a3d7-83ebda9aebff.jpg 


转载请注明原创地址,谢谢配合!http://qindongliang.iteye.com/

相关文章
相关标签/搜索