博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单倒排索引Java实现
阅读量:6431 次
发布时间:2019-06-23

本文共 2079 字,大约阅读时间需要 6 分钟。

  hot3.png

1、首先定义数据如下

212927_dSi8_2756867.png        212941_mA7g_2756867.png        212953_AjcV_2756867.png

预期结果

213632_hV65_2756867.png

2、

分析:Mapper传给Reducer的格式应该是(关键字,文档名),Reducer层会自动将inputKey相同的inputValue值组成一个list,然后遍历输出就OK。

实现:原理知道了,开始实现

public class Index {

    private static class IndexMapper extends Mapper<LongWritable, Text, Text, Text> {

        @Override

        protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, Text>.Context context)  throws IOException, InterruptedException {
            // 可以获取文件名,根据文件名来判定传入reducer的形式
            String fileName = ((FileSplit) context.getInputSplit()).getPath().getName();
            System.out.println(fileName);
            String[] strs = value.toString().trim().split(" ");
            for(int i=0; i<strs.length; i++){
                context.write(new Text(strs[i]), new Text(fileName));
            }
        }
    }

    private static class IndexReducer extends Reducer<Text, Text, NullWritable, Text> {

        @Override

        protected void reduce(Text value, Iterable<Text> datas, Reducer<Text, Text, NullWritable, Text>.Context context)  throws IOException, InterruptedException {
            String resultStr="";
            for(Text data:datas){
                String[] strs = data.toString().split("[.]");
                String[] res = resultStr.split(",");
                if(!strs[0].equals(res[res.length-1])){
                    resultStr+=strs[0]+",";
                }
                resultStr = resultStr.substring(0, resultStr.length()-1);
                context.write(NullWritable.get(), new Text(value.toString()+":"+resultStr));
            }
        }
    }
    
    public static void main(String[] args) {
        try {
            Configuration cfg = HadoopCfg.getConfigration();
            Job job = Job.getInstance(cfg);
            job.setJobName("Index");
            job.setJarByClass(Index.class);
            job.setMapperClass(IndexMapper.class);
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(Text.class);
            job.setReducerClass(IndexReducer.class);
            job.setOutputKeyClass(NullWritable.class);
            job.setOutputValueClass(Text.class);
            FileInputFormat.addInputPath(job, new Path("/input/index"));
            FileOutputFormat.setOutputPath(job, new Path("/index/"));
            System.exit(job.waitForCompletion(true) ? 0 : 1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

输出就不说了,和期望的一样。大家可以试试,这个程序和逻辑都比较简单。

写在最后:每天积累一点就是离理想更近一步。不要管程序简单与否,踏踏实实扎实每一步才是硬道理。下一篇博客我将与大家分享稍微复杂的倒排索引实现。

大家下来可以自己练一下哟~~~

PS:测试数据与现在一样,预期输出为:

231825_7qrq_2756867.png 

转载于:https://my.oschina.net/eager/blog/675229

你可能感兴趣的文章
android studio adb
查看>>
框架源码系列二:手写Spring-IOC和Spring-DI(IOC分析、IOC设计实现、DI分析、DI实现)...
查看>>
asp.net编译 懒人脚本
查看>>
二分答案经典入门题:)
查看>>
为什么你需要将代码迁移到ASP.NET Core 2.0?
查看>>
Servlet的多线程和线程安全
查看>>
存储树形的数据表转为Json
查看>>
CAN 总线通信控制芯片SJA1000 的读写
查看>>
oauth授权协议的原理
查看>>
OutputCache说明
查看>>
sdl2.0示例
查看>>
数学 --- 高斯消元 POJ 1830
查看>>
Ejabberd源码解析前奏--集群
查看>>
[ZHUAN]Flask学习记录之Flask-SQLAlchemy
查看>>
【转】Install SmartGit via PPA in Ubuntu 13.10/13.04/12.04/Linux Mint
查看>>
PNG怎么转换成32位的BMP保持透明
查看>>
经验分享:CSS浮动(float,clear)通俗讲解
查看>>
WTL中最简单的实现窗口拖动的方法(转)
查看>>
数据结构—队列
查看>>
C. Adidas vs Adivon
查看>>