`
weitao1026
  • 浏览: 1050264 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

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

Java代码 复制代码 收藏代码
  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  
i am hadoop
i am hadoop
i am lucene
i am hbase
i am hive
i am hive sql
i am pig


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'  
--大数据交流群: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'


处理结果如下:

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)  
(i,7)
(am,7)
(pig,1)
(sql,1)
(hive,2)
(hbase,1)
(hadoop,2)
(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'  
--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'


输出结果如下:

Java代码 复制代码 收藏代码
  1. (i,7)  
  2. (am,7)  
(i,7)
(am,7)



如果使用JAVA来编写这个MapReduce作业,后面的排序统计topn,必须得重新写一个job来执行,因为MapReduce干的事非常简单,一个job仅仅只处理一个功能,而在Pig中它会自动,帮我们分析语法树来构建多个依赖的MapReduce作业,而我们无须关心底层的代码实现,只需专注我们的业务即可。

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

分享到:
评论

相关推荐

    写一个程序用来从终端读入一行文本,并把这行文本中的英文转换成Pig Latin,Pig Latin是按照如下简单规则转换每个英文单词的一种自发明语言。

    - `piglatinize(const char *word, char *piglatin_word)`函数是主要的转换函数,首先判断单词的第一个字符是否为元音,然后根据规则进行转换。使用`strcpy()`,`strncat()`和`strcat()`等字符串处理函数进行操作。...

    log4j-pig-master_java_

    1. **Spring Boot 2.4**:作为Spring框架的快速开发工具,Spring Boot简化了配置,提供了自动配置功能,使得开发者可以快速构建可运行的应用程序。Spring Boot 2.4引入了许多新特性,如Java 11支持、改进的健康检查...

    log4j-pig-master.zip

    "log4j"是Apache的一个开源项目,它为Java应用程序提供了强大的日志记录服务。在Java世界里,log4j是一个广泛使用的日志框架,允许开发者灵活地控制日志信息的输出。 【描述】"基于Spring Cloud、oAuth2.0开发基于...

    Python实现Pig Latin小游戏实例代码

    3. Pig Latin语言游戏规则:Pig Latin游戏的基本规则是将单词的第一个辅音字母或辅音字母串移到单词的末尾,并在后面加上“ay”。如果是以元音字母开头的单词,则只需要在单词末尾加上“way”或“yay”(具体规则...

    7.Hadoop入门进阶课程_第7周_Pig介绍、安装与应用案例.pdf

    根据提供的文档信息,这是一门关于Hadoop生态系统的入门级课程中的第七周内容,主要介绍了Pig这一工具的基本概念、安装过程以及如何通过Pig进行数据分析的实际案例。 #### 二、Pig简介 Pig是由Yahoo贡献给Apache...

    开源项目-esimov-pigo.zip

    总的来说,Pigo为Go开发者提供了一个轻便的面部检测工具,尤其适用于那些希望避免使用大型第三方库或者对性能有较高要求的项目。对于想要学习面部检测技术或者对Go编程感兴趣的开发者来说,这是一个极好的学习资源。

    基于微信小程序开发的嘿嘿猪音乐小程序源码.zip

    在本压缩包“基于微信小程序开发的嘿嘿猪音乐小程序源码.zip”中,包含的是一个名为“hey-hey-pig-music-applet-master”的项目源码,主要用于开发一款以“嘿嘿猪”为主题的音乐播放微信小程序。这个小程序的目标是...

    pig-master.zip

    本项目“pig-master.zip”正是这样一个系统,它利用了最新的技术栈,包括Spring Boot 3.0、Spring Cloud 2022以及Alibaba的相关组件,同时集成了SAS OAuth2进行身份验证和授权,实现了微服务架构下的角色基础访问...

    Pig-Latin:Java Pig Latin转换器

    Java Pig Latin转换器就是一个程序,能够根据Pig Latin的规则,将输入的英文单词或句子转化为Pig Latin形式。 在Java中实现Pig Latin转换器涉及到对字符串的处理、条件判断以及循环结构等基础知识。下面我们将深入...

    java-pig-latin:Pig Latin,使用Java!

    `countLeadingConsonants`方法则遍历单词的前几个字符,统计直至遇到第一个元音之前的辅音数量。 对于特殊情况,如"qu",我们可以在`translate`方法内添加额外的条件检查。例如,如果单词长度大于2且前两个字符为...

    商业编程-源码-PIGO mini v1.1.zip

    PIGO mini可能是一个针对商业环境设计的小型化、轻量级的软件或系统,用于解决特定的业务需求。通过分析其标签"商业编程-源码-PIGOmin",我们可以推测这可能是某个商业软件开发项目的一部分,PIGOmin可能是项目简称...

    TutorialsPoint Kafka Pig Storm Arduino FLex Impala OAuth2 Tableau Vim 教程

    1. **Apache Kafka**:Kafka是一个分布式流处理平台,常用于构建实时数据管道和流应用。它支持发布/订阅模式的数据传递,具有高吞吐量和低延迟的特性,是大数据生态系统中的关键组件。 2. **Apache Pig**:Pig是...

    PIG串口助手 VB6.0 源码

    VB串口调试助手,我的第一个VB程序 1、自动搜素串口号 2、支持十六进制收发 3、支持接收TEXT自定义长度换行 4、同步显示输入字符串的ASC码

    F2-pig-latin

    1. 检查单词的第一个字母是否是元音。如果是,直接在末尾添加"way"。 2. 如果不是元音,找到第一个元音的位置,然后截取从第一个字母到第一个元音前的所有辅音字母。 3. 将这些辅音移到单词末尾,并添加"ay"。 4. ...

    pigDice:用Ember构建的Pig Dice模拟器应用程序

    此应用程序旨在通过 Epicodus 代码学校满足作业的要求。 有关 Epicodus 的更多信息,请 。 描述 模拟猪骰子的网络游戏 作业:星期四课业JavaScript 第 2 周 作者 弗兰克·约翰逊(Frank Johnson)和小川保罗(Paul ...

    程序设计入门—Python-week51

    对于编程小测验的题目,第一题涉及文件处理,我们需要读取names.txt文件,找到最长的回文人名。回文是指正读反读都一样的字符串,可以通过双指针法或者构建辅助字符串来检测是否为回文。第二题考察的是字符串索引,...

    pig_latin

    项目名称由Usarneme + Shane技术栈: ... 对于以一个或多个辅音开头的单词,将所有第一个连续的辅音移到末尾,并添加“ ay”。 如果第一个辅音包含“ qu”,请将“ u”与“ q”一起移动。 不要忘了诸如“尖叫”之类的词

    MapReduce入门程序

    理解并实现WordCount程序是学习Hadoop MapReduce的第一步,这将帮助你掌握基本的分布式计算概念。随着深入学习,你可以探索更复杂的数据处理任务,如Join、Shuffle、Sort等操作,以及优化MapReduce作业性能的策略,...

Global site tag (gtag.js) - Google Analytics