一、问题背景

  倒排索引其实就是出现次数越多,那么权重越大,不过我国有凤巢....zf为啥不管,总局回应推广是不是广告有争议...

  eclipse里ctrl+t找接口或者抽象类的实现类,看看都有啥方法,有时候hadoop的抽象类返回的接口没有需要的方法,那么我们返回他的实现类。

  吧需要的文件放入hdfs下的目录下,只要不是以下划线开头的均算。

二、理论准备

  搜索引擎查询的时候就是查询这个单词文档矩阵,旺旺采用倒排索引存储,后缀树也可以。

  不管理论直接看例子,这是原始的文档

  下面是简单的索引,只是表征是否在文档中出现过。

  下面就是文档及出现次数。

  擦,咋有点想协同过滤。

三、思路分析

  其实是一个全文检索的数据结构。理论上关键字出现次数越多,那么文章就越靠前。

  就是wc的加强版本。wc是统计单词在文章里出现的次数,倒排是统计关键字在各个文章出现的次数。

  有时候不能一下子写出来,可能需要多次mr,那么我们首先确定最终的结果形式,然后向上反推。

  如果多个mr,考虑使用combiner,不过要考虑combiner是不是可插拔的,也就是combiner和业务逻辑是否和reducer一样。

  怎么知道单词出现在那个文章里?从context对象里获取。既然能忘context写东西,那么也能从其中获取信息。

  最终结果是

hello	"a.txt->5 b.txt->3"
tom "a.txt->2 b.txt->1"
kitty "a.txt->1"

  那么reduce的输出

context.write("hello","a.txt->5 b.txt->3");

  那么combiner阶段是

<"hello",{"a.txt->5","b.txt->3"}>

  那么map的输出

context.write("hello","a.txt->5");
context.write("hello","b.txt->3");

  不过考虑到wc,map的输出应该是,路径放在value不好处理,还要廉价呢。

context.write("hello->a.txt",1);
context.write("hello->a.txt",1);
context.write("hello->a.txt",1);
context.write("hello->a.txt",1);
context.write("hello->a.txt",1); context.write("hello->b.txt",1);
context.write("hello->b.txt",1);
context.write("hello->b.txt",1);

  那么combiner阶段根据就输出

<"hello->a.txt",1>
<"hello->a.txt",1>
<"hello->a.txt",1>
<"hello->a.txt",1>
<"hello->a.txt",1> <"hello->b.txt",1>
<"hello->b.txt",1>
<"hello->b.txt",1> context.write("hello","a.txt->5");
context.write("hello","b.txt->3");

 次是不同文件的相同key并没有合并,reducer合并输出皆可。

四、代码实现

4.1 Mapper

public class IIMapper1 extends Mapper<LongWritable, Text, Text, Text> {

	private Text k = new Text();
//下面其实是int,不过也可以在接收端Integer.parseInt转了就好
private Text v = new Text();
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
String[] words = line.split(" ");
//从context对象里找到单词属于那个文章
//context.getInputSplit();找到切片 按ctrl找 发现返回时InputSplit
//不过是个抽象类 ctrl + t找他的实现类
//能把数据写入context,繁殖也能从context拿到很多信息
//从下面inputSplit调用get的时候发现没有合适的方法,那么我们找他的实现类,调用实现类的方法
//InputSplit inputSplit = context.getInputSplit();
//inputSplit.get //他的子类很多 我们处理文件就用File开头的 然后有个getPath
FileSplit inputSplit = (FileSplit)context.getInputSplit();
//文件名是hdfs://hostname:port/a/1.txt
//我们戒掉hdfs://hostname:port 不能戒掉a 应为这是文件夹否则不知道1.txt来自哪 其他文件家下可能也有同名文件
//也可以不接去
String path = inputSplit.getPath().toString();
for(String w:words) {
k.set(w+"->"+path);
v.set("1");
context.write(k, v);
}
} }

  

4.2 Combiner

String[] wordAndPath = key.toString().split("->");
String word = wordAndPath[0];
String path = wordAndPath[1];
// process values
int sum = 0;
for (Text val : value) {
sum += Integer.parseInt(val.toString());
}
k.set(word);
v.set(path+"->"+sum);
context.write(k, v);

  

4.3 Reducer

//不涉及多线程 用StringBuilde即可
StringBuilder sb = new StringBuilder();
// process values
for (Text val : value) {
sb.append(val.toString()).append("\t");
}
context.write(key, new Text(sb.toString()));

  

四、实验分析

MapReduce实现倒排索引(类似协同过滤)的更多相关文章

  1. 基于物品的协同过滤ItemCF的mapreduce实现

    文章的UML图比较好看..... 原文链接:www.cnblogs.com/anny-1980/articles/3519555.html 基于物品的协同过滤ItemCF 数据集字段: 1.  Use ...

  2. 基于MapReduce的(用户、物品、内容)的协同过滤推荐算法

    1.基于用户的协同过滤推荐算法 利用相似度矩阵*评分矩阵得到推荐列表 已经推荐过的置零 2.基于物品的协同过滤推荐算法 3.基于内容的推荐 算法思想:给用户推荐和他们之前喜欢的物品在内容上相似的物品 ...

  3. 基于协同过滤的个性化Web推荐

    下面这是论文笔记,其实主要是摘抄,这片博士论文很有逻辑性,层层深入,所以笔者保留的比较多. 看到第二章,我发现其实这片文章对我来说更多是科普,科普吧…… 一.论文来源 Personalized Web ...

  4. SimRank协同过滤推荐算法

    在协同过滤推荐算法总结中,我们讲到了用图模型做协同过滤的方法,包括SimRank系列算法和马尔科夫链系列算法.现在我们就对SimRank算法在推荐系统的应用做一个总结. 1. SimRank推荐算法的 ...

  5. MapRedcue的demo(协同过滤)

    MapRedcue的演示(协同过滤) 做一个关于电影推荐.你于你好友之间的浏览电影以及电影评分的推荐的协同过滤. 百度百科: 协同过滤简单来说是利用某兴趣相投.拥有共同经验之群体的喜好来推荐用户感兴趣 ...

  6. 吴裕雄--天生自然HADOOP操作实验学习笔记:协同过滤算法

    实验目的 初步认识推荐系统 学会用mapreduce实现复杂的算法 学会系统过滤算法的基本步骤 实验原理 前面我们说过了qq的好友推荐,其实推荐算法是所有机器学习算法中最重要.最基础.最复杂的算法,一 ...

  7. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  8. 【转载】协同过滤 & Spark机器学习实战

    因为协同过滤内容比较多,就新开一篇文章啦~~ 聚类和线性回归的实战,可以看:http://www.cnblogs.com/charlesblc/p/6159187.html 协同过滤实战,仍然参考:h ...

  9. Spark MLlib之协同过滤

    原文:http://blog.selfup.cn/1001.html 什么是协同过滤 协同过滤(Collaborative Filtering, 简称CF),wiki上的定义是:简单来说是利用某兴趣相 ...

随机推荐

  1. #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案

    郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...

  2. Symantec Backup Exec 2012 Agent For Linux安装

    Backup Exec 2012 介绍 Backup Exec 2012 是一种为虚拟和物理环境提供保护的集成产品,能够简化备份和灾难恢复,并提供了无可匹敌的恢复功能.借助于强大的 Symantec ...

  3. Python 常用模块之time&datetime 和random

    本节大纲: 模块介绍 time &datetime模块 random 一.模块介绍: 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他 ...

  4. jQuery1.6源码分析系列

    原文地址:http://www.cnblogs.com/nuysoft/archive/2011/11/14/2248023.html jQuery源码分析(版本1.6.1) 目录 00 前言开光 0 ...

  5. LLVM 笔记(三)—— 了解传统编译器设计

    ilocker:关注 Android 安全(新手) QQ: 2597294287 传统的静态编译器 (如大多数的 C 语言编译器) 通常将编译工作分为三个阶段,分别由三个组件来完成:前端.优化器和后端 ...

  6. Mac安装Windows 10的简明教程

    每次在Mac上安装Windows都是一件非常痛苦的事情,曾经为了装Win8把整台Mac的硬盘数据都弄丢了,最后通过龟速系统恢复模式恢复了MacOSX(50M电信光纤下载了3天才把系统下载完),相信和我 ...

  7. kali 2.0 U盘安装错误Your installation cd-rom couldn't be mounted

    1.kali 2.0前天(2015.08.11)发布了.果断下载下来换掉本机的1.0版本. 2.用U盘安装的过程中,出现cd-rom无法挂载.提示错误Your installation CD-ROM ...

  8. 遍历List集合,删除符合条件的元素

    List集合的遍历有三种方式:增强for循环,普通for循环,Iterator迭代器遍历 如果只是对集合进行遍历,以上三种循环都可正常遍历: (1)增强For循环遍历List集合 List<St ...

  9. 利用QMP和QEMU虚拟机交互的几种方式

    QMP是一种基于JSON格式的传输协议,我们能利用它与一个QEMU虚拟机实例进行交互,例如查询,更改虚拟机的状态,获取设备信息等等.下面是几种创建QMP的方法以及对其它的一些基本命令的使用: 1.基于 ...

  10. 双11遇上ZBrushCore,如此优惠还等什么!

    对不起!让大家久等了,ZBrush简体中文版ZBrushCore这次是真的来了,恰逢双11,老板说了,钱不是问题,你们开心就好,特别是热爱3D的单身狗们!你们那么热爱这个行业,1099元/套终身授权使 ...