hadoop组合器

vd2z7a6w  于 2021-05-29  发布在  Hadoop
关注(0)|答案(0)|浏览(173)

情况
我试图输出一个倒排索引,以术语作为键和文档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());
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题