亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

Hadoop編程基于MR程序實現倒排索引示例

2024-09-01 13:53:12
字體:
來源:轉載
供稿:網友

相信接觸過搜索引擎開發的同學對倒排索引并不陌生,谷歌、百度等搜索引擎都是用的倒排索引,關于倒排索引的有關知識,這里就不再深入講解,有興趣的同學到網上了解一下。這篇博文就帶著大家一起學習下如何利用Hadoop的MR程序來實現倒排索引的功能。

一、數據準備

1、輸入文件數據

這里我們準備三個輸入文件,分別如下所示

a.txt

hello tom hello jerry hello tom 

b.txt

hello jerry hello jerry tom jerry 

c.txt

hello jerry hello tom 

2、最終輸出文件數據

最終輸出文件的結果為:

[plain] view plain copyhello  c.txt-->2 b.txt-->2 a.txt-->3  jerry  c.txt-->1 b.txt-->3 a.txt-->1  tom c.txt-->1 b.txt-->1 a.txt-->2  

二、倒排索引過程分析

根據輸入文件數據和最終的輸出文件結果可知,此程序需要利用兩個MR實現,具體流程可總結歸納如下:

-------------第一步Mapper的輸出結果格式如下:-------------------- context.wirte("hello->a.txt", "1") context.wirte("hello->a.txt", "1") context.wirte("hello->a.txt", "1") context.wirte("hello->b.txt", "1") context.wirte("hello->b.txt", "1") context.wirte("hello->c.txt", "1") context.wirte("hello->c.txt", "1") -------------第一步Reducer的得到的輸入數據格式如下:------------- <"hello->a.txt", {1,1,1}> <"hello->b.txt", {1,1}> <"hello->c.txt", {1,1}> -------------第一步Reducer的輸出數據格式如下--------------------- context.write("hello->a.txt", "3") context.write("hello->b.txt", "2") context.write("hello->c.txt", "2") -------------第二步Mapper得到的輸入數據格式如下:----------------- context.write("hello->a.txt", "3") context.write("hello->b.txt", "2") context.write("hello->c.txt", "2") -------------第二步Mapper輸出的數據格式如下:-------------------- context.write("hello", "a.txt->3") context.write("hello", "b.txt->2") context.write("hello", "c.txt->2") -------------第二步Reducer得到的輸入數據格式如下:----------------- <"hello", {"a.txt->3", "b.txt->2", "c.txt->2"}> -------------第二步Reducer輸出的數據格式如下:----------------- context.write("hello", "a.txt->3 b.txt->2 c.txt->2") 最終結果為: hello  a.txt->3 b.txt->2 c.txt->2 

三、程序開發

3.1、第一步MR程序與輸入輸出

package com.lyz.hdfs.mr.ii; import java.io.IOException; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; 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.input.FileSplit; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; /**  * 倒排索引第一步Map Reduce程序,此處程序將所有的Map/Reduce/Runner程序放在一個類中  * @author liuyazhuang  *  */ public class InverseIndexStepOne {   /**    * 完成倒排索引第一步的mapper程序    * @author liuyazhuang    *    */   public static class StepOneMapper extends Mapper<LongWritable, Text, Text, LongWritable>{     @Override     protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, LongWritable>.Context context)         throws IOException, InterruptedException {       //獲取一行數據       String line = value.toString();       //切分出每個單詞       String[] fields = StringUtils.split(line, " ");       //獲取數據的切片信息       FileSplit fileSplit = (FileSplit) context.getInputSplit();       //根據切片信息獲取文件名稱       String fileName = fileSplit.getPath().getName();       for(String field : fields){         context.write(new Text(field + "-->" + fileName), new LongWritable(1));       }     }   }   /**    * 完成倒排索引第一步的Reducer程序    * 最終輸出結果為:    * hello-->a.txt  3     hello-->b.txt  2     hello-->c.txt  2     jerry-->a.txt  1     jerry-->b.txt  3     jerry-->c.txt  1     tom-->a.txt 2     tom-->b.txt 1     tom-->c.txt 1    * @author liuyazhuang    *    */   public static class StepOneReducer extends Reducer<Text, LongWritable, Text, LongWritable>{     @Override     protected void reduce(Text key, Iterable<LongWritable> values,         Reducer<Text, LongWritable, Text, LongWritable>.Context context) throws IOException, InterruptedException {       long counter = 0;       for(LongWritable value : values){         counter += value.get();       }       context.write(key, new LongWritable(counter));     }   }   //運行第一步的MR程序   public static void main(String[] args) throws Exception{     Configuration conf = new Configuration();     Job job = Job.getInstance(conf);     job.setJarByClass(InverseIndexStepOne.class);     job.setMapperClass(StepOneMapper.class);     job.setReducerClass(StepOneReducer.class);     job.setMapOutputKeyClass(Text.class);     job.setMapOutputValueClass(LongWritable.class);     job.setOutputKeyClass(Text.class);     job.setOutputValueClass(LongWritable.class);     FileInputFormat.addInputPath(job, new Path("D:/hadoop_data/ii"));     FileOutputFormat.setOutputPath(job, new Path("D:/hadoop_data/ii/result"));     job.waitForCompletion(true);   } } 

3.1.1 輸入數據

a.txt

hello tom hello jerry hello tom 

b.txt

hello jerry hello jerry tom jerry 

c.txt

hello jerry hello tom 

3.1.2

輸出結果:

hello-->a.txt  3 hello-->b.txt  2 hello-->c.txt  2 jerry-->a.txt  1 jerry-->b.txt  3 jerry-->c.txt  1 tom-->a.txt 2 tom-->b.txt 1 tom-->c.txt 1 

3.2 第二步MR程序與輸入輸出

package com.lyz.hdfs.mr.ii; import java.io.IOException; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; 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; /**  * 倒排索引第二步Map Reduce程序,此處程序將所有的Map/Reduce/Runner程序放在一個類中  * @author liuyazhuang  *  */ public class InverseIndexStepTwo {   /**    * 完成倒排索引第二步的mapper程序    *    * 從第一步MR程序中得到的輸入信息為:    * hello-->a.txt  3     hello-->b.txt  2     hello-->c.txt  2     jerry-->a.txt  1     jerry-->b.txt  3     jerry-->c.txt  1     tom-->a.txt 2     tom-->b.txt 1     tom-->c.txt 1    * @author liuyazhuang    *    */   public static class StepTwoMapper extends Mapper<LongWritable, Text, Text, Text>{     @Override     protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, Text>.Context context)         throws IOException, InterruptedException {       String line = value.toString();       String[] fields = StringUtils.split(line, "/t");       String[] wordAndFileName = StringUtils.split(fields[0], "-->");       String word = wordAndFileName[0];       String fileName = wordAndFileName[1];       long counter = Long.parseLong(fields[1]);       context.write(new Text(word), new Text(fileName + "-->" + counter));     }   }   /**    * 完成倒排索引第二步的Reducer程序    * 得到的輸入信息格式為:    * <"hello", {"a.txt->3", "b.txt->2", "c.txt->2"}>,    * 最終輸出結果如下:    * hello  c.txt-->2 b.txt-->2 a.txt-->3     jerry  c.txt-->1 b.txt-->3 a.txt-->1     tom c.txt-->1 b.txt-->1 a.txt-->2    * @author liuyazhuang    *    */   public static class StepTwoReducer extends Reducer<Text, Text, Text, Text>{     @Override     protected void reduce(Text key, Iterable<Text> values, Reducer<Text, Text, Text, Text>.Context context)         throws IOException, InterruptedException {       String result = "";       for(Text value : values){         result += value + " ";       }       context.write(key, new Text(result));     }   }   //運行第一步的MR程序   public static void main(String[] args) throws Exception{     Configuration conf = new Configuration();     Job job = Job.getInstance(conf);     job.setJarByClass(InverseIndexStepTwo.class);     job.setMapperClass(StepTwoMapper.class);     job.setReducerClass(StepTwoReducer.class);     job.setMapOutputKeyClass(Text.class);     job.setMapOutputValueClass(Text.class);     job.setOutputKeyClass(Text.class);     job.setOutputValueClass(Text.class);     FileInputFormat.addInputPath(job, new Path("D:/hadoop_data/ii/result/part-r-00000"));     FileOutputFormat.setOutputPath(job, new Path("D:/hadoop_data/ii/result/final"));     job.waitForCompletion(true);   } } 

3.2.1 輸入數據

hello-->a.txt  3 hello-->b.txt  2 hello-->c.txt  2 jerry-->a.txt  1 jerry-->b.txt  3 jerry-->c.txt  1 tom-->a.txt 2 tom-->b.txt 1 tom-->c.txt 1 

3.2.2 輸出結果

hello  c.txt-->2 b.txt-->2 a.txt-->3  jerry  c.txt-->1 b.txt-->3 a.txt-->1  tom c.txt-->1 b.txt-->1 a.txt-->2  

總結

以上就是本文關于Hadoop編程基于MR程序實現倒排索引示例的全部內容,希望對大家有所幫助。有什么問題可以直接留言,小編會及時回復大家的。感謝朋友們對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲深夜福利视频| 丁香五六月婷婷久久激情| 欧美极品在线播放| 国产精品91久久久| 丝袜亚洲欧美日韩综合| 中文字幕精品—区二区| 亚洲美女福利视频网站| 中文字幕一精品亚洲无线一区| 国产一区在线播放| 色无极亚洲影院| 38少妇精品导航| 中文字幕日韩电影| 综合欧美国产视频二区| 久久成年人免费电影| 久久久久久久一区二区三区| 亚洲电影免费观看高清完整版在线观看| 亚洲国产福利在线| 国产精品久久久久7777婷婷| 欧美专区在线观看| 日韩电影在线观看中文字幕| 久久国产精品久久久久久| 国产精品人成电影在线观看| 中文字幕精品av| 亚洲国产成人一区| 亚洲视频一区二区| 亚洲国产精品中文| 精品一区二区三区三区| 亚洲伊人久久综合| 国产精品第三页| 日韩av一区二区在线观看| 欧美成人激情在线| 国产一区二区三区视频| 深夜精品寂寞黄网站在线观看| 国产美女久久久| 中文字幕日韩在线观看| 久久久精品在线观看| 亚洲精品国产成人| 57pao国产成人免费| 亚洲电影在线看| 欧美视频专区一二在线观看| 成人国产亚洲精品a区天堂华泰| 91精品国产91久久久久久吃药| 国产成人涩涩涩视频在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲女人天堂成人av在线| 国产精品精品久久久久久| 精品国产欧美一区二区三区成人| 精品亚洲夜色av98在线观看| 亚洲天堂免费观看| 欧美大秀在线观看| 亚洲欧美中文日韩在线v日本| 亚洲欧美激情一区| 亚洲电影免费在线观看| 欧美在线一区二区视频| 91理论片午午论夜理片久久| 欧美电影免费在线观看| 欧美精品在线视频观看| 国产+人+亚洲| 国产一区二区丝袜高跟鞋图片| 久久人人爽人人| 亚洲成人av在线播放| 亚洲综合精品一区二区| 久久国产精彩视频| 国产欧美日韩高清| 午夜精品福利在线观看| 日韩成人在线播放| 国产一区二区三区四区福利| 欧美夜福利tv在线| 日韩av一区二区在线| 欧美性受xxxx白人性爽| 亚洲激情在线观看| 久久久噜噜噜久久中文字免| 亚洲国产精彩中文乱码av在线播放| 中文字幕日韩欧美| 欧美电影免费观看网站| 精品久久久久久中文字幕| 亚洲欧美三级伦理| 91av在线不卡| 亚洲电影免费观看高清完整版在线| 九九久久国产精品| 黄色一区二区三区| 亚洲欧洲日本专区| 亚洲乱码国产乱码精品精| 日韩成人网免费视频| 日韩中文有码在线视频| 超碰日本道色综合久久综合| 国产精品久久久久久影视| 久久九九国产精品怡红院| 国产欧美最新羞羞视频在线观看| 国产一区二区丝袜| 亚洲毛片在线观看.| 久久精品视频在线观看| 国产精品精品视频| 日韩中文字幕不卡视频| 亚洲自拍小视频| 欧美中在线观看| 7777kkkk成人观看| 国语自产在线不卡| 久久久久久免费精品| 日韩在线观看视频免费| 亚洲美腿欧美激情另类| 国产三级精品网站| 亚洲电影第1页| 伊人亚洲福利一区二区三区| 538国产精品一区二区在线| 色在人av网站天堂精品| 欧美在线视频导航| 日韩在线不卡视频| 国产精品激情av电影在线观看| 色老头一区二区三区| 日韩电影中文 亚洲精品乱码| 亚洲色图五月天| 日韩亚洲一区二区| 日韩欧美中文字幕在线播放| 国产999在线| 久久激情视频久久| 国产精品美女久久久久久免费| 精品国产区一区二区三区在线观看| 欧美成人免费视频| 日日骚久久av| 国产欧美va欧美va香蕉在线| 成人精品视频久久久久| 尤物九九久久国产精品的分类| 国产不卡视频在线| 久久av红桃一区二区小说| 亚洲成色999久久网站| 欧美日韩国产色视频| 精品福利在线看| 国产一区二区三区精品久久久| 一区二区日韩精品| 亚洲欧美国产高清va在线播| 国产成人综合一区二区三区| 91福利视频网| 中文字幕欧美日韩在线| 亚洲国产私拍精品国模在线观看| 97精品一区二区视频在线观看| 中文字幕精品一区久久久久| 精品久久中文字幕久久av| 欧美国产日韩免费| 成人乱色短篇合集| 国产精品一区二区久久久| 国产综合在线视频| 欧美性猛交xxxx偷拍洗澡| 色狠狠av一区二区三区香蕉蜜桃| 96精品视频在线| 久久久久久久久国产精品| 亚洲欧美日韩精品久久亚洲区| 久久久久国产精品免费网站| 97在线视频免费| 黑人巨大精品欧美一区二区免费| 国色天香2019中文字幕在线观看| 久久天天躁夜夜躁狠狠躁2022| 中文字幕欧美日韩va免费视频| 久久亚洲精品国产亚洲老地址| 日韩精品亚洲精品| 国产精品久久久久久av福利| 国产mv免费观看入口亚洲| 亚洲人高潮女人毛茸茸| 日韩av观看网址| 国内精品久久久久久久久| 日韩在线观看成人| 中文字幕视频在线免费欧美日韩综合在线看| 欧美激情视频免费观看| 久久久久久久国产精品|