MR案例:倒排索引

1.map阶段:将单词和URI组成Key值(如“MapReduce :1.txt”),将词频作为value。

  利用MR框架自带的Map端排序,将同一文档的相同单词的词频组成列表,传递给Combine过程,实现类似于WordCount的功能。

Class Map<Longwritable, Text, Text, Longwritable>{

    method map(){

        //获取输入分片对应的文件名
        String fileName=((FileSplit)context.getInputSplit()).getPath().getName();

        for(String word : value.split()){

            //输出:<key,value>---<"MapReduce:1.txt",1>
            context.write(new Text(word+":"+fileName), new Longwritable(1))
        }
    }
}

2.Combiner阶段:将key值相同的value值累加,得到一个单词在文档中的词频。

如果直接将Map的输出作为Reduce的输入,当前key值(由单词、URI组成)无法保证相同的word会分发到同一个Reduce处理,所以必须修改key值和value值。将单词作为key值,URI和词频作为value值,可以利用MR框架默认的HashPartitioner类完成分区过程,将相同单词的所有记录发送给同一个Reducer处理。

Class Combine<Text, Longwritable, Text, Text>{

    method reduce(){

        for(Long long : v2s){

            //词频求和
            sum += Long.parseLong(long.toString());
        }

        //输出:<key,value>----<"Mapreduce","0.txt:2">
        context.write(new Text(word), new Text(fileName+":"+sum));
    }
}

3.reduce阶段:将相同key值的value值组合成倒排索引文件所需的格式即可。

Class Reduce<Text, Longwritable, Text, Text>{

    method reduce(){

        String valueList = new String();

        //输入:<"MapReduce",list("0.txt:1","1.txt:1","2.txt:1")>
        for(Text text : v2s){

            valueList += text.toString()+";";
        }

        //输出:<"MapReduce","0.txt:1,1.txt:1,2.txt:1">
        context.write(key, new Text(valueList));
    }
}

注意事项:本实例设计的倒排索引在文件数目上没有限制,但是单词文件不宜过大,要保证每个文件对应一个 split。否则,由于 Reduce 过程没有进一步统计词频,最终结果可能会出现词频未统计完全的单词。

解决方案:

  1. 重写InputFormat 类将每个输入文件分为一个 split,避免上述情况。
  2. 执行两次 MapReduce,第一次MapReduce 用于统计词频,第二次 MapReduce 用于生成倒排索引。
  3. 可以利用复合键值对等实现包含更多信息的倒排索引。
时间: 2024-10-10 00:03:08

MR案例:倒排索引的相关文章

大数据技术之_05_Hadoop学习_04_MapReduce_Hadoop企业优化(重中之重)+HDFS小文件优化方法+MapReduce扩展案例+倒排索引案例(多job串联)+TopN案例+找博客共同粉丝案例+常见错误及解决方案

第6章 Hadoop企业优化(重中之重)6.1 MapReduce 跑的慢的原因6.2 MapReduce优化方法6.2.1 数据输入6.2.2 Map阶段6.2.3 Reduce阶段6.2.4 I/O传输6.2.5 数据倾斜问题6.2.6 常用的调优参数6.3 HDFS小文件优化方法6.3.1 HDFS小文件弊端6.3.2 HDFS小文件解决方案第7章 MapReduce扩展案例7.1 倒排索引案例(多job串联)7.2 TopN案例7.3 找博客共同粉丝案例第8章 常见错误及解决方案 第6章

MR案例:CombineFileInputFormat

此案例让我明白了三点:详见 解读:MR多路径输入 和 解读:CombineFileInputFormat类 对于单一输入路径情况: //指定输入格式CombineFileInputFormat job.setInputFormatClass(CombineTextInputFormat.class); //指定SplitSize CombineTextInputFormat.setMaxInputSplitSize(job, 60*1024*1024L); //指定输入路径 CombineTex

mapreduce 高级案例倒排索引

理解[倒排索引]的功能 熟悉mapreduce 中的combine 功能 根据需求编码实现[倒排索引]的功能,旨在理解mapreduce 的功能. 一:理解[倒排索引]的功能 1.1 倒排索引: 由于不是根据文档来确定文档所包含的内容,而是进行相反的操作,因而称为倒排索引 简单来说根据单词,返回它在哪个文件中出现过,而且频率是多少的结果.例如:就像百度里的搜索,你输入一个关键字,那么百度引擎就迅速的在它的服务器里找到有该关键字的文件,并根据频率和其他一些策略(如页面点击投票率)等来给你返回结果

MR案例:输出/输入SequenceFile

SequenceFile文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File).在SequenceFile文件中,每一个key-value对被看做是一条记录(Record),基于Record的压缩策略,SequenceFile文件支持三种压缩类型: NONE: 对records不进行压缩; (组合1) RECORD: 仅压缩每一个record中的value值; (组合2) BLOCK: 将一个block中的所有records压缩在一起;(组合3) p

MR案例:WordCount改写

请参照wordcount实现一个自己的MapReduce,需求为: a. 输入文件格式: xxx,xxx,xxx,xxx,xxx,xxx,xxx b. 输出文件格式: xxx,20 xxx,30 xxx.40 c. 功能:根据命令行参数统计输入文件中指定关键字出现的次数,并展示出来 例如:hadoop jar xxxxx.jar keywordcount xxx,xxx,xxx,xxx(四个关键字) package demo0830; import org.apache.hadoop.conf.

MR案例:多表关联

问题描述:两种类型输入文件:address类(地址)和company类(公司)进行一对多的关联查询,得到地址名(例如:Beijing)与公司名(例如:Beijing JD.Beijing Red Star)的关联信息. 1.map阶段:对比于前者的单表关联可知,reduce阶段的key必须为关联两表的key,即address.Id = company.Id.则两表经过map处理输出的key必须是Id. Class Map<LongWritable, Text, LongWritable, Tex

MR案例:小文件合并SequeceFile

SequeceFile是Hadoop API提供的一种二进制文件支持.这种二进制文件直接将<key, value>对序列化到文件中.可以使用这种文件对小文件合并,即将文件名作为key,文件内容作为value序列化到大文件中.这种文件格式有以下好处: 1). 支持压缩,且可定制为基于Record或Block压缩(Block级压缩性能较优)2). 本地化任务支持:因为文件可以被切分,因此MapReduce任务时数据的本地化情况应该是非常好的.3). 难度低:因为是Hadoop框架提供的API,业务

MR案例:基站相关01

字段解释: product_no:用户手机号: lac_id:用户所在基站: start_time:用户在此基站的开始时间: staytime:用户在此基站的逗留时间. product_no lac_id moment start_time user_id county_id staytime city_id 13429100031 22554 8 2013-03-11 08:55:19.151754088 571 571 282 571 13429100082 22540 8 2013-03-

分布式缓存DistributedCache

本文是对MR案例:Map-Join的解读. 在hadoop中,使用全局变量或全局文件共享的几种方法 使用Configuration的set()方法,只适合数据内容比较小的场景 将共享文件放在HDFS上,每次都去读取,效率比较低 将共享文件放在DistributedCache里,在setup()初始化一次后,即可多次使用,缺点是不支持修改操作,仅能读取 使用 DistributedCache 来共享一些全局配置文件或变量时,需要注意: 共享文件必须要上传到hdfs上.[共享文件的默认访问协议为(h