マッパーを介して複数のキーを作成し、それらをレデューサーに渡していくつかの機能を実行しました。一度に複数のキーを同じレデューサーに送信する方法はありますか? 実際には、一度に 1 つのレデューサーのキーに関連付けられた値が必要です。前もって感謝します!
1 に答える
複数のキーを同じリデューサーにパーティション分割するだけの場合は、カスタマイズしたものを記述し、Partitioner
一緒にパーティション分割するキーに対して同じ int を生成するだけです。
パーティショニングだけでは不十分でありreduce(K k, Iterator<V>)
、一度に複数のキーを送信したい場合は、コンパレータを実装し、複数のキーを等しく比較し、コンパレータを に設定する必要がある場合もありますjob.setGroupingComparatorClass(GourpingClass.class)
。
からの適応例としてHadoop: The definitive Guide P279
:
あなたのデータは次のようなものです:
1990 35 A1 A2 A3 A4
1990 34 B1 B2 B3 B4
1990 34 C2 C2 C3 C4
1991 36 [other data here]
1991 35 [other data here]
年と度をマップ出力の結合キーとして作成し、異なる年のキーのみを異なるリデューサーに分割する場合は、次のように実装しますYearPartitioner
。
public static class YearPartitioner extends Partitioner<CombineKey, V> {
int getPartition(CombineKey k, V value, int numPartitions) {
return k.getyear % numPartitions;
}
}
そして Set YearPartitioner
as job.setPartitionerClass(YearPartitoner.class)
、これらを行うことで、1990 年のデータはすべて同じレデューサーに送信され、カスタマイズされたデータreduce()
は最初<1990,35>
にキーとして、値リストとして<<A1 A2 A3 A4>>
呼び出され、再び<1990, 34>
キー<<B1 B2 B3 B4>,<C2 C2 C3 C4>>
として、値リストとして呼び出されます。
さらに進んで値リストとして一度にキーとしてreduce
呼び出されるようにしたい場合は、keyComparator を実装し、それを<1990,x>
<<A1 A2 A3 A4>,<B1 B2 B3 B4>,<C2 C2 C3 C4>>
GroupingComparatorClass