日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hadoop实例之利用MapReduce实现Wordcount单词统计 (附源代码)

發(fā)布時(shí)間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hadoop实例之利用MapReduce实现Wordcount单词统计 (附源代码) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大致思路是將hdfs上的文本作為輸入,MapReduce通過InputFormat會(huì)將文本進(jìn)行切片處理,并將每行的首字母相對于文本文件的首地址的偏移量作為輸入鍵值對的key,文本內(nèi)容作為輸入鍵值對的value,經(jīng)過在map函數(shù)處理,輸出中間結(jié)果<word,1>的形式,并在reduce函數(shù)中完成對每個(gè)單詞的詞頻統(tǒng)計(jì)。整個(gè)程序代碼主要包括兩部分:Mapper部分和Reducer部分。

?

Mapper代碼

?

public static class doMapper extends Mapper<Object, Text, Text, IntWritable>{ //第一個(gè)Object表示輸入key的類型;第二個(gè)Text表示輸入value的類型;第三個(gè)Text表示表示輸出鍵的類型;第四個(gè)IntWritable表示輸出值的類型??public static final IntWritable one = new IntWritable(1); public static Text word = new Text(); @Override protected void map(Object key, Text value, Context context) throws IOException, InterruptedException//拋出異常 { StringTokenizer tokenizer = new StringTokenizer(value.toString(), " "); //StringTokenizer是Java工具包中的一個(gè)類,用于將字符串進(jìn)行拆分while(tokenizer.hasMoreTokens()) //循環(huán)每一行拆分出的所有單詞 { word.set(tokenizer.nextToken());?//返回當(dāng)前位置到下一個(gè)分隔符之間的字符串context.write(word, one); //將word存到容器中,記一個(gè)數(shù)?? }} }

?

map函數(shù)里有三個(gè)參數(shù),前面兩個(gè)Object key,Text value就是輸入的keyvalue,第三個(gè)參數(shù)Context context是可以記錄輸入的keyvalue。例如context.write(word,one);此外context還會(huì)記錄map運(yùn)算的狀態(tài)。map階段采用Hadoop的默認(rèn)的作業(yè)輸入方式,把輸入的valueStringTokenizer()方法截取出的單詞設(shè)置為key,設(shè)置value1,然后直接輸出<key,value>

?

Reducer代碼

?

public static class doReducer extends Reducer<Text, IntWritable, Text, IntWritable>{ //參數(shù)同Map一樣,依次表示是輸入鍵類型,輸入值類型,輸出鍵類型,輸出值類型private IntWritable result = new IntWritable(); @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable value : values) { sum += value.get(); } //for循環(huán)遍歷,將得到的values值累加?? result.set(sum); System.out.println(sum);context.write(key, result); } }

?

map輸出的<key,value>先要經(jīng)過shuffle過程把相同key值的所有value聚集起來形成<key,values>后交給reduce端。reduce端接收到<key,values>之后,將輸入的key直接復(fù)制給輸出的key,for循環(huán)遍歷values并求和,求和結(jié)果就是key值代表的單詞出現(xiàn)的總次,將其設(shè)置為value,直接輸出<key,value>

完整代碼:

?

import java.io.IOException; import java.util.StringTokenizer; 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; public class WordCount { public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { Job job = Job.getInstance(); job.setJobName("WordCount"); job.setJarByClass(WordCount.class); job.setMapperClass(doMapper.class); job.setReducerClass(doReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); Path in = new Path("hdfs://192.168.68.130:9000/user/hadoop/wordcount.txt"); //需要統(tǒng)計(jì)的文本所在位置 Path out = new Path("hdfs://192.168.68.130:9000/user/hadoop/output3"); //注意output3不能存在 FileInputFormat.addInputPath(job, in); FileOutputFormat.setOutputPath(job, out); System.exit(job.waitForCompletion(true) ? 0 : 1); } public static class doMapper extends Mapper<Object, Text, Text, IntWritable>{ public static final IntWritable one = new IntWritable(1); public static Text word = new Text(); @Override protected void map(Object key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer tokenizer = new StringTokenizer(value.toString(), " "); while(tokenizer.hasMoreTokens()) { word.set(tokenizer.nextToken());context.write(word, one); }} } public static class doReducer extends Reducer<Text, IntWritable, Text, IntWritable>{ private IntWritable result = new IntWritable(); @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable value : values) { sum += value.get(); } result.set(sum); System.out.println(sum);context.write(key, result); } } }

?

轉(zhuǎn)載于:https://www.cnblogs.com/sakura--/p/11448874.html

總結(jié)

以上是生活随笔為你收集整理的Hadoop实例之利用MapReduce实现Wordcount单词统计 (附源代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩偷拍一区 | 91精品国产一区二区无码 | 久久精品国产亚洲a | 九九视频免费在线观看 | 超碰在线免费观看97 | 日韩福利小视频 | 中文字幕精品一区二区精品 | 国模少妇一区二区 | 亚洲精品视频久久久 | 天堂网久久 | 亚洲综合久久久 | 伊人久久中文 | 色就是色av | 天天插天天射天天干 | 亚洲一区在线免费观看 | 国产成人精品a视频一区 | 亚洲精品久久久久久久久久 | 国产美女自慰在线观看 | 可以直接看av的网址 | 日本美女全裸 | 精品一区二区三区四区五区六区 | 性生活在线视频 | 日本一区二区三区在线免费观看 | 久久人妻少妇嫩草av无码专区 | 波多在线视频 | 69视频免费看 | 女人性做爰100部免费 | 日韩av免费在线看 | 一区二区三区在线视频播放 | 男女草逼 | 日本乳汁视频 | 操人在线观看 | 麻豆免费在线观看视频 | 亚洲精品一区二区三区蜜桃 | 婷婷综合在线 | 欧美大片www| 99久久精品国产一区二区成人 | 成人超碰 | 成人免费毛片网 | 欧美福利精品 | av女星全部名单 | 综合久久一区二区 | 3d动漫啪啪精品一区二区中文字幕 | 国产精品日日夜夜 | 天天免费视频 | 亚洲熟女一区二区 | 久久婷婷综合国产 | 一级特级黄色片 | 人妻丰满熟妇av无码区免 | 国产精品久久久久久久久久久免费看 | 一区二区三区视频 | 一区二区三区不卡视频 | 成人毛片18女人毛片免费 | 色眯眯视频 | 91网址在线播放 | 免费看a级片 | 国语对白在线观看 | 手机在线一区二区三区 | 国产精品网页 | 成年人免费在线观看视频网站 | a∨色狠狠一区二区三区 | 99热激情| 国产一区不卡视频 | 欧美成人hd | 天天操夜夜干 | 欧美性另类 | 日本中文字幕在线看 | 日本欧美黄色 | 亚洲奶汁xxxx哺乳期 | 一本大道久久a久久综合婷婷 | 无码人妻精品中文字幕 | 免费毛片av | 亚洲图片欧美在线看 | 亚洲av无码日韩精品影片 | 国内偷拍一区二区 | 色一情一乱一区二区三区 | 奇米网一区二区 | 阿v天堂在线观看 | 伊人365 | 爱爱视频网址 | 成人性生活视频 | 中文字幕狠狠 | 亚洲黄色在线播放 | 在线天堂在线 | 国产深夜福利在线 | 美女啪啪av | 久久久久一区 | 你懂得在线 | 日本va欧美va精品发布 | 久草在在线 | 狠狠干成人 | 欧美国产综合 | 色汉综合 | 成人黄色免费在线观看 | 台湾黄色网址 | 久久色中文字幕 | 91精品人妻一区二区三区果冻 | 操小妞| 成人欧美一区二区三区白人 |