imはreduce関数でPageRankNode(2つのフィールドを持つ)のiterableを入力値として受け取り、それを優先度キューに追加するmapreduceプログラムを作成します。各オブジェクトを反復して優先度キューに追加すると、結果の優先度キューには最後に追加されたオブジェクトのみが含まれます。 しかし、私は同じタイプの新しいオブジェクトを作成し、優先度のキューに追加すると予想どおりに動作しているようです。新しいオブジェクトを追加する優先度キューと既に作成済みの追加
私はなぜこれが起こっているのだろうか? 以下のサンプルが動作します。しかし、 "topPages.add(新しいPageRankNode(pageNode.pageName、pageNode.pageRank))"の代わりに、 "topPages.add(pageNode)"を使用すると、期待どおりに動作しません。
優先度キューのコンパレータの実装も以下に追加されています。
private Comparator<PageRankNode> comparator= new PageNodeComparator();
private PriorityQueue<PageRankNode> topPages= new PriorityQueue<PageRankNode>(100,comparator);
public void reduce(NullWritable key,Iterable<PageRankNode> pageNodes,Context context) throws IOException,InterruptedException{
for(PageRankNode pageNode:pageNodes){
//topPages.add(pageNode);
topPages.add(new PageRankNode(pageNode.pageName,pageNode.pageRank));
if(topPages.size()>100){
topPages.poll();
}
}
PageRankNode pageNode;
while(!topPages.isEmpty()){
pageNode=topPages.poll();
context.write(NullWritable.get(),new Text(pageNode.pageName+":"+pageNode.pageRank));
}
}
public class PageNodeComparator implements Comparator<PageRankNode>{
public int compare(PageRankNode x,PageRankNode y){
if(x.pageRank < y.pageRank){
return -1;
}
if(x.pageRank > y.pageRank){
return 1;
}
return 0;
}
}