情况
我试图输出一个倒排索引,以术语作为键和文档number:frequency as 价值观。值列表按频率降序排列。理想情况下,我希望只使用一个mapreduce阶段/作业来完成此任务。
term1 -> (doc3, 2) (doc1, 1) (doc5, 1)
term2 -> (doc2, 3) (doc3, 2) (doc6, 1)
我试过的
我的程序现在的工作方式是创建一个复合键(term,docnum=count,freq=1)和一个自然值(docnum=count,freq=1)。我从Map上传递这些键,值对。在合并过程中,我将频率相加,并将其作为新的频率值传递给组合键和自然值。最后,在reduce阶段,我输出键和值列表。
问题
对于我的复合键,我设置了比较器,以便它按降序排列频率。但是,我最初将术语frequency传递为1(这样我就可以在combine阶段将它们相加)。似乎二次排序比较发生在合并之前。不是在我对频率求和之后比较频率值,而是在求和之前进行比较。因此在上面的例子中,term2->doc2的频率1将与term2->doc2的频率1进行比较,而不是term2->doc2的频率3将与term2->doc3的频率2进行比较。
我不知道如何将频率按降序排列。
compositekey.java(比较)
@Override
public int compareTo(TermCompositeKey termCompositeKey) {
int result = this.term.compareTo(termCompositeKey.getTerm());
if (result == 0) {
this.tf.compareTo(termCompositeKey.getTf());
}
return result;
}
合并比较程序.java
public class TermCombinerComparator extends WritableComparator {
protected TermCombinerComparator() {
super(TermCompositeKey.class, true);
}
@SuppressWarnings("rawtypes")
@Override
public int compare(WritableComparable wc1, WritableComparable wc2) {
int result = 0;
TermCompositeKey termCompositeKey1 = (TermCompositeKey) wc1;
TermCompositeKey termCompositeKey2 = (TermCompositeKey) wc2;
result = termCompositeKey1.getTerm().compareTo(termCompositeKey2.getTerm());
if (result == 0) {
result= (int)(termCompositeKey1.getDocPosition() - termCompositeKey2.getDocPosition());
}
return result;
}
groupingcomparator.java文件
public class TermGroupingComparator extends WritableComparator {
protected TermGroupingComparator() {
super(TermCompositeKey.class, true);
}
@SuppressWarnings("rawtypes")
@Override
public int compare(WritableComparable wc1, WritableComparable wc2) {
TermCompositeKey termCompositeKey1 = (TermCompositeKey) wc1;
TermCompositeKey termCompositeKey2 = (TermCompositeKey) wc2;
return termCompositeKey1.getTerm().compareTo(termCompositeKey2.getTerm());
}
暂无答案!
目前还没有任何答案,快来回答吧!