初学编程的人,都知道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脚本,来搞定这件事,测试数据如下: 

  1. i am hadoop
  2. i am hadoop
  3. i am lucene
  4. i am hbase
  5. i am hive
  6. i am hive sql
  7. i am 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'

处理结果如下:

  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的功能: 

  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'

输出结果如下:

  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),如果有什么疑问,技术问题,职业问题等,欢迎在公众号上留言与我探讨!让我们做不一样的攻城师!谢谢大家!  

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

最新文章

  1. Java 之 数据库
  2. IIS发布WCF遇到的问题总结
  3. pyhon之对memcached及redis操作
  4. js动画 无缝轮播 进度条 文字页面展示 div弹窗遮罩效果
  5. HDU-3586 Information Disturbing(树形DP+删边)
  6. 使用HTML5中postMessage实现Ajax中的POST跨域问题
  7. mysql颠覆实战笔记(一)--设计一个项目需求,灌入一万数据先
  8. 【Java】java的内存浅析
  9. iptables 添加,删除,查看,修改
  10. Struts2 拦截器具体配置过程
  11. Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析
  12. C3P0 WARN: Establishing SSL connection without server's identity verification is not recommended
  13. java中注解的使用
  14. 下载文件,blob方式
  15. (四)jdk8学习心得之函数式接口
  16. JavaSE基础知识(5)—面向对象(5.5 this和super关键字)
  17. C#之WebApi权限认证_学习笔记1
  18. BZOJ5100 : [POI2018]Plan metra
  19. Windows7下安装与破解IntelliJ IDEA2017
  20. Navicat 远程连接 Oracle11g 数据库报错 No listener 的问题

热门文章

  1. coco2dx android package..
  2. 在Linux(centos)下,安装Apache和PHP环境
  3. bzoj 3579: 破冰派对
  4. 9.spark Core 进阶2--Cashe
  5. equal 与 hashCode
  6. net.sf.jsqlparser.statement.select.PlainSelect.getGroupBy()Lnet/sf/jsqlparse
  7. 小程序唤起App
  8. Http学习(一)
  9. java获取服务器路径
  10. 6_3.springboot2.x数据整合Mybatis(注解和非注解)