`
臻是二哥
  • 浏览: 190647 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
Group-logo
Java技术分享
浏览量:0
社区版块
存档分类
最新评论

使用复合键优化倒排索引

阅读更多

巧用复合键优化倒排索引程序

之前写了一个倒排索引的程序,但是可以注意在到生成的索引文档中,一个单词对应的文档并非是按照词频的大小进行排列的。这不是我们最想要的结果,我们希望对应的文档按照词频的大小进行排列。

这里我们使用复合键来完成对文档的排序。

巧用复合键可以达到一些优化效果,比如说将多个细粒度的键值对合并为一个处理度的键值对,这样可以减小集群中网络的开销。



 比如:

可以优化为:<a,<b:1,c:3,d:5,e:8,f:4>>

上面的例子将5<K,V>优化为一个<K,V>,减小了网络的开销。特别是当数据量很大的时候,这样合并的机会就会很多。优化的效果也会很客观。

当然,我们亦可以使用复合键来完成排序功能。

在倒排索引中,我们希望单词对应的文档按照词频大小来排列。但是如果在本地进行排序的话往往因为数据量很大而出现各种问题。此时,我们想到MapReduce框架,在Mapper过程中,框架会自动进行排序。

因此,我们将要进行排序的词频和原来的K一起,组成复合键作为Reducer的输入。因此可以看到在Combiner类中,输出发生变化。如图:





 

好了,接下来我们该写reduce()方法了,我们需要按照词频输出单词所在的文档,而实际上,reduce()的输入已经是按照词频输入了。因此,我们看下面伪代码:

MyReducer class start

String preKey=null;

String preValue="";

Reduce method start

if(preKey==null)

preKeypreValue赋值

if(preKey!=null)

if(preKey.equals(strs[0])){

preValue添加内容

}

if(!preKey.equals(strs[0])){

preKeypreValue输出

重置preKeypreValue的值

preKey = strs[0];

}

}

}

Reduce method end

preKeypreValue输出

MyReducer class end

 

至此,代码优化工作已将完成,但是,问题又来了,因为Combiner输出的时候K值包含词频,所以如果按照原来的方式Shuffle的话,会将统一单词映射到不同的Reducer中,显然这是不对的,因此,我们重写getPartition()方法。伪代码如下:

MyPartitioner class start

getPartition method start

  调用HashPartitioner类的getPartition()方法,并将从K中提取出的单词那部分作为参数

getPartition method end

MyPartitioner class end

 

优化的代码见附件。

 

  • 大小: 2 KB
  • 大小: 10.7 KB
  • 大小: 11.6 KB
  • 大小: 12.4 KB
  • 大小: 10.5 KB
  • 大小: 23.5 KB
1
0
分享到:
评论

相关推荐

    深入浅出理解索引结构

    5. **倒排索引(Inverted Index)**:倒排索引常见于全文搜索引擎,如Elasticsearch。它将每个词的出现位置存储在一个列表中,当搜索特定词汇时,可以直接查看该词汇的列表,找到包含该词的文档。 除了索引结构,还...

    用Java写的基于大数据集的多指标动态索引案例

    4. **索引原理**:索引是一种数据结构,如B树、哈希表或倒排索引,用于提高数据访问速度。在多指标动态索引中,每个指标可能对应一个独立的索引,通过联合这些索引,可以快速定位满足多个条件的数据记录。 5. **...

    新手学习MySQL索引

    3. 全文索引:MyISAM和InnoDB(5.6.4以后版本)支持全文索引,用于搜索文本中的关键词,使用倒排索引来提高搜索效率。 4. 空间数据索引:MyISAM存储引擎支持R-Tree索引,适合地理数据存储,可以高效处理多维数据的...

    ORACLE数据库总结.pdf

    - **倒排索引**:用于全文搜索。 **创建索引**: ```sql CREATE INDEX item_index ON itemfile (itemcode); ``` **重建索引**: ```sql ALTER INDEX item_index REBUILD; ``` **改索引名**: ```sql ALTER INDEX ...

Global site tag (gtag.js) - Google Analytics