WordCount词频统计

WordCount词频统计

from educoder实训
实训项目地址:https://www.educoder.net/shixuns/aekgf6pz/challenges

本关任务

词频统计是最能体现MapReduce思想的程序,结构简单,上手容易。

词频统计的大致功能是:统计单个或者多个文本文件中每个单词出现的次数,并将每个单词及其出现频率按照<k,v>键值对的形式输出,其基本执行流程如下图所示:

the overall mapreduce word count process

由图可知:

  1. 输入文本(可以不只一个),按行提取文本文档的单词,形成行<k1,v1>键值对,具体形式很多,例如<行数,字符偏移>等;
  2. 通过Spliting将<k1,v1>细化为单词键值对<k2,v2>;
  3. Map分发到各个节点,同时将<k2,v2>归结为list(<k2,v2>);
  4. 在进行计算统计前,先用Shuffing将相同主键k2归结在一起形成<k2,list(v2)>;
  5. Reduce阶段直接对<k2, list(v2)> 进行合计得到list(<k3,v3>)并将结果返回主节点。

主节点对预设文本文档进行词频统计,并将最终结果输出。

注:输入和输出事先已经预定,只要比较输出是否达到预期即可判断是否达到要求。

相关知识

MapReduce采用”分而治之”的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果。MapReduce框架负责处理了并行编程中分布式存储、工作调度、负载均衡、容错均衡、容错处理以及网络通信等复杂问题。将处理过程高度抽象为两个函数:map和reduce。

map负责把任务分解成多个任务;
reduce负责把分解后多任务处理的结果汇总起来。

注:MapReduce处理的数据集必须可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理。不是关系型数据库,而是结构化的。

map处理阶段

对于给定的待处理文本文档,其map阶段的处理如下:

通过Text对象,获取文本文档的内容。
逐行处理文档,将单词提取出来。
每个单词为key,对应的value设为1,将<k2,v2>对输出。

关键性说明:

  1. map阶段的处理,主要是如何对文本进行逐行的单词分割,从而获取单词,以及将键值对分发到各个节点(此处由hadoop隐性提供,用户先不必关心hdfs存储过程)。

  2. 可以参考的单词分割提取代码模板如下:

public void map(Object key,Text value,Context context)throws IOException,InterruptedException
{//对文本内容对象value进行分割StringTokenizer itr=new StringTokenizer(valu e.toString());    while(itr.hasMoreTokens()) {String word=itr.nextToken();/*获取分割好的单词*//*可以在该循环体中,使用获取好的单词word变量进行key和value的设定。*/}
}

reduce处理阶段

在Wordcount的reduce阶段,主要是将每个单词的数量统计出来,包括:

在各个节点并行循环统计每个单词出现的次数。
将各个节点的结果汇总以list(<k3,v3>)的形式输出。

reduce函数参考模板:

public void reduce(Object key,Iterable<IntWritable> values,Context context)throws IOException, InterruptedException
{int count=0;for(IntWritable itr:vlaues){count+=itr.get();  /*循环统计*/}/*统计完成后,将结果输出.....*/
}

编程要求

本关的编程任务是补全右侧代码片段中map和reduce函数中的代码,具体要求及说明如下:

在主函数main中已初始化hadoop的系统设置,包括hadoop运行环境的连接。

在main函数中,已经设置好了待处理文档路径(即input),以及结果输出路径(即output)。

在main函数中,已经声明了job对象,程序运行的工作调度已经设定好。

本关只要求在map和reduce函数的指定区域进行代码编写,其他区域请勿改动。

测试说明

以下是测试样例:

测试输入样例数据集:文本文档test1.txt和test2.txt

文档test1.txt中的内容为:

tale as old as timetrue as it can bebeauty and the beast

文档test2.txt中的内容为:

 ever just the sameever as before
beauty and the beast

预期输出result.txt文档中的内容为:
and 2
as 4
beast 2
beauty 2
before 1
can 1
ever 2
it 1
just 1
old 1
same 1
tale 1
the 3
time 1
true 1

注:由于启动服务、编译等耗时,以及MapReduce过程资源消耗较大,评测时间较长(30s左右)!

请耐心等待!相信自己!通往成功的路上不会太久!

建议完成本关后尝试在本机上根据相关指导搭建环境运行程序,这样理解更深刻!

合抱之木,生于毫末;九层之台,起于累土!复杂源于简单,要想铸就高楼大厦必须打牢基础!

开始你的任务吧,祝你成功!

如果你觉得这一关的内容对你有帮助,请你在下面点赞。

代码参考

import java.io.IOException; import java.util.StringTokenizer;     import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import   org.apache.hadoop.mapreduce.Job; import   org.apache.hadoop.mapreduce.Mapper; import   org.apache.hadoop.mapreduce.Reducer; import   org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import   org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import   org.apache.hadoop.util.GenericOptionsParser;   public classWordCount    { 	/*  	* MapReduceBase类:实现Mapper和Reducer接口的基类      	*Mapper接口:   	*   WritableComparable接口:实现WritableComparable的类可以相互比较。所有被用作key的类要实现此接口。 */     public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{  	/* 	*LongWritable,IntWritable,Text是Hadoop中实现的用于封装Java数据类型的类,这些类实现了WritableComparable接口,*都能够被串行化,便于在分布式环境中进行数据交换,可以视为long,int,String数据类型的替代。 	*/    private final static IntWritable one = new IntWritable(1);   private Text word = new Text();//Text实现了BinaryComparable类,可以作为key值/* 	* Mapper接口中的map方法:  	* void map(K1 key, V1 value,    OutputCollector<K2,V2> output, Reporter reporter) 	*   映射一个单个的输入<K1,V1>对到一个中间输出<K2,V2>对  	*   中间输出对不需要和输入对是相同的类型,输入对可以映射到0个或多个输出对。 	 	*   OutputCollector接口:收集Mapper和Reducer输出的<K,V>对。  	*   OutputCollector接口的collect(k, v)方法:增加一个(k,v)对到output  	* Reporter   用于报告整个应用的运行进度*/  public void map(Object key, Text value, Context context) throws IOException, InterruptedException {/** 原始数据(以test1.txt为例):* 	tale as old as time 		true as it can be 		beauty and the beast 		map阶段,数据如下形式作为map的输入值:key为偏移量 			<0  tale as old as time><21 world java hello> 			<39 you me too>	*//*** 解析(Spliting)后以得到键值对<K2,V2>(仅以test1.txt为例)* 格式如下:前者是键值,后者数字是值* tale 1* as 1* old 1* as 1* time 1* true 1* as 1* it 1* can 1* be 1* beauty 1* and 1* the 1* beast 1* 这些键值对作为map的输出数据*///****请补全map函数内容****// 	/*********begin*********/StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) {word.set(itr.nextToken());context.write(word, one);}/*********end**********/}   }    public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {    private IntWritable result = new IntWritable();/* 	 *    reduce过程是对输入键值对洗牌(Shuffing)形成<K2,list(V2)>格式数据(仅以test1.txt为例): 	 *  (tablie [1]) 	 * (as [1,1,1]) 	 * (old [1]) 	 * (time [1]) 	 * (true[1]) 	 * (it [1]) 	 * (can [1]) 	 * (be [1]) 	 * (beauty [1]) 	 *   (and [1]) 	 * (the [1]) 	 * (beast [1]) 	 * 作为reduce的输入 	 *  	 */   public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {    //****请补全reduce对<k2, list(v2)> 进行合计得到list(<k3,v3>)过程****///*********begin*********/int sum = 0;for (IntWritable val : values) {sum += val.get();}result.set(sum);context.write(key, result);/*********end**********///****请将list(<k3,v3>)统计输出****///*********begin*********//*********end**********/ 	} }   public static void main(String[]    args) throws Exception { 	  /*** JobConf:map/reduce的job配置类,向hadoop框架描述map-reduce执行的工作 * 构造方法:JobConf()、JobConf(Class exampleClass)、JobConf(Configuration conf)等 */      Configuration conf = new Configuration();    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();/* 	* 需要配置输入和输出的HDFS的文件路径参数 	* 可以使用"Usage:    wordcount <in><out>"实现程序运行时动态指定输入输出 	*/    if (otherArgs.length != 2) {System.err.println("Usage: wordcount <in> <out>");System.exit(2);    }    Job job = new Job(conf, "word count");//Job(Configuration conf,String jobName)设置job名称   job.setJarByClass(WordCount.class);//为job设置Mapper类/*********begin*********///****请为job设置Mapper类****//    job.setMapperClass(TokenizerMapper.class);job.setCombinerClass(IntSumReducer.class);//为job设置Combiner类//****请为job设置Reduce类****//    job.setReducerClass(IntSumReducer.class);//****请设置输出key的参数类型****//    job.setOutputKeyClass(Text.class);//****请设置输出value的类型****//job.setOutputValueClass(IntWritable.class);/*********end**********/FileInputFormat.addInputPath(job, new Path(otherArgs[0]));//为map-reduce任务设置InputFormat实现类,设置输入路径   FileOutputFormat.setOutputPath(job, newPath(otherArgs[1]));//为map-reduce任务设置OutputFormat实现类,设置输出路径   System.exit(job.waitForCompletion(true) ? 0 : 1);   } }

纯代码

import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class WordCount {public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(Object key, Text value, Context context) throws IOException, InterruptedException {StringTokenizer itr = new StringTokenizer(value.toString());while (itr.hasMoreTokens()) {word.set(itr.nextToken());context.write(word, one);}}}public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {private IntWritable result = new IntWritable();public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {sum += val.get();}result.set(sum);context.write(key, result);}}public static void main(String[] args) throws Exception {Configuration conf = new Configuration();String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();if (otherArgs.length != 2) {System.err.println("Usage: wordcount <in> <out>");System.exit(2);}Job job = new Job(conf, "word count");job.setJarByClass(WordCount.class);job.setMapperClass(TokenizerMapper.class);job.setCombinerClass(IntSumReducer.class);job.setReducerClass(IntSumReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path(otherArgs[0]));FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));System.exit(job.waitForCompletion(true) ? 0 : 1);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38953.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WordCount单词统计笔记

1.在本机的/root目录下&#xff0c;依次创建文件夹data,文本文件word.txt. mkdir -p /root/data vim /root/data/word.txt键入i,进入编辑模式&#xff0c;输入如下内容&#xff1a; hello world hadoop hdfs qingjiao hadoop hongya hdfs qingjiao qingjiao hadoop hongya键入…

用python统计你的文章里每个英文单词的数量

p i heared a story about you #你的文章段 linesp.strip().split(\n) words_cnt{} for line in lines:lineline.replace(,,).lower() #逗号都用英文状态的wordsline.split( ) #括号里面的单引号里有空格for word in words:words_cnt[word]words_cnt.get(word,0)1 words_lstl…

Python实现统计文本当中单词的数量,

这是阿里巴巴2016年的一道面试题&#xff1a; 统计英文文章中单词出现的次数&#xff0c;并且输出出现次数的前10个单词 文本如下&#xff1a; Accessing Text from the Web and from Disk Electronic Books A small sample of texts from Project Gutenberg appears in the …

wordcount单词词频统计

单词出现的总次数 1、WordCount概述 WordCount算是大数据计算领域经典的入门案例&#xff0c;相当于Hello World。 虽然WordCount业务极其简单&#xff0c;但是希望能够通过案例感受背后MapReduce的执行流程和默认的行为机制&#xff0c;这 才是关键。 2、WordCount编程实现…

Python实现统计文本中各单词数量

Python实现统计文本中各单词数量 代码运行结果 代码 import strings not talk,not helo show me your code hello helo for i in s:变例s中的字符&#xff0c;如果属于标点符号则替换成空格if i in string.punctuation:s s.replace(i, ) # print(s) lst s.split() # s被空…

华为机试—统计单词个数(map)

输入n个单词&#xff0c;统计各个单词出现的个数 #include <iostream> #include <map> #include <string> using namespace std;int main() {map<string,int> k;string word;while(cin>>word)k[word];for(map<string,int>::iterator ik.be…

[云炬python3玩转机器学习] 5-7,8 多元线性回归正规解及其实现

08 实现我们自己的 Linear Regression import numpy as np import matplotlib.pyplot as plt from sklearn import datasets import datetime;print("Run by CYJ,",datetime.datetime.now()) Run by CYJ, 2022-01-20 20:06:04.130127 boston datasets.load_boston()…

手机号验证码登录的思路

引言 当前很多web端的应用登录方式主要分为以下几种&#xff1a; 账号密码登录手机号验证码登录扫码登录 这里我主要说一下我对于手机号验证码登录的思路&#xff0c;如果有遗漏或者差错的地方&#xff0c;请指正&#xff1b; 整体流程 大致流程如下&#xff1a; 大致就是…

手机验证码登录,账号登录结合

本项目基于腾讯外包框架&#xff08;wei框架&#xff09; 地址&#xff1a;https://github.com/twinh/wei/tree/master/docs/zh-CN#wei HTML页面&#xff1a; 【基于bootstrap前端框架】 头部&#xff1a;<ul id"js-reset-tabs" class"nav tab-underline…

手机号验证登录用例

手机号验证登录 1.手机号验证登录是我们现在比较常见的登录方式&#xff0c;下面分享一下基本的用例的编写。能帮助您是我的荣幸&#xff0c;不喜勿喷&#xff0c;谢谢&#xff01;

手机号验证码登录

登录入口 1.app 正常登录入口 2.app 网页登录&#xff0c;比如分享直播卡片时&#xff0c;进入直播间需要先进行登录 3.pc 登录 一&#xff0c;app常见的登录方式 1.手机号验证码登录 2.用户名密码登录 3.一键登录 二&#xff0c;手机验证码登录示意图 三&#xff0c;流…

chatgpt赋能python:Python代码的快捷键:让编程速度更加快速高效

Python代码的快捷键&#xff1a;让编程速度更加快速高效 Python是一种面向对象、直译式计算机程序设计语言&#xff0c;备受程序员喜爱。虽然Python本身已经趋于简洁易读&#xff0c;但使用Python代码编辑器的快捷键可以进一步提高编程效率&#xff0c;帮助合理利用时间。 为…

chatgpt赋能python:Python实现滚动小球

Python实现滚动小球 Python是一种高级编程语言&#xff0c;可以用于开发各种类型的应用程序。在此我们将介绍如何使用Python编写代码实现滚动小球。这个小球会在屏幕上滚动&#xff0c;给用户一个视觉效果。 实现滚动小球的Python代码 import pygameBLACK (0, 0, 0) WHITE …

流浪地球2的科学幻想与现实中的未来计算机科技

作为一个科幻迷、《三体》迷&#xff0c;从小时候第一次看《珊瑚岛上的死光》开始&#xff0c;一直期待一部国产科幻电影。等待了40余年&#xff0c;有生之年终于如愿以偿。 周末二刷了《流浪地球2》。丁老师认为这部科幻电影已经超越了1&#xff0c;以及原著&#xff0c;成为…

还在为投稿发愁吗?ICCVIT 2023,一个计算机、视觉与智能技术国际会议

◆ChatGPT热潮带来的行业革新大行其道&#xff0c;相关区块链、信息安全、视觉、机器学习....产业必将带来诸多变革。 本文为大家梳理了近期可投的4则EI检索的国际会议&#xff0c;均可推荐发表SCI&#xff0c;还有超多IEEE Fellow主讲&#xff0c;不仅涵盖计算机各个学科方向&…

不刷卡,不扫码,微信推出刷掌支付;Meta将再裁员6000人;AI“黑箱”被打开?谷歌找到大模型能力涌现机制|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

Chat-GPT有感

Chat-GPT有感 1、Chat-GPT是什么&#xff1f; ​ 2023年当红炸子鸡非Chat-GPT莫属&#xff0c;或许我们即将站在历史的开端、站在人工智能涌现的开端、站在科技百花齐放的开端&#xff0c;我也想问问Chat-GPT&#xff0c;它到底是什么呢&#xff1f; GPT全称为Generative Pre…

前端多语言开发,如何中英文切换

本文以vue为例&#xff1a; 在vue项目中配置两个js文件&#xff0c;一个中文一个英文 将main.js中引入配置好的文件 添加切换中英文的按钮 在methods中写入点击事件 js文件中&#xff0c;把需要的中英文分别写入 在需要的页面中写入 但需要注意的是&#xff0c;在标签中使用$t…

【TypeScript入门】了解TypeScript的工作流程

走进“前端的未来”TS——了解TS的工作流程 文章简介主要内容1 TypeScript工作流程1.1 图示简单解释1.2 理顺区分JS与其他语言 2 如何用TypeScript运行web2.1 为项目添加html文件2.2 用npm高效管理前端项目2.3 npm项目依赖 summary下期预告【基础入门】《前端的未来——TypeScr…

vue2实现中英文切换

简单的使用&#xff08;应用场景&#xff1a;少量几个页面的中英文切换&#xff09; 1、安装 vue-i18n依赖 yarn add vue-i18n 或者 npm install vue-i18n --save-dev 2、在src/components下新建文件夹language&#xff0c;并在文件夹language下新建zh.js及en.js 【src/compon…