0

マッパーを介して複数のキーを作成し、それらをレデューサーに渡していくつかの機能を実行しました。一度に複数のキーを同じレデューサーに送信する方法はありますか? 実際には、一度に 1 つのレデューサーのキーに関連付けられた値が必要です。前もって感謝します!

4

1 に答える 1

2

複数のキーを同じリデューサーにパーティション分割するだけの場合は、カスタマイズしたものを記述し、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 YearPartitioneras 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

于 2014-06-15T07:16:53.617 に答える