2017-03-24 16 views
0

MapReduceについては、Java,Hadoopを使用しています。MapReduce:MapperとReducerは変数を共有できますか?

入力(txtファイル):

doc1 apple pizza apple 
doc2 pear apple 
doc3 cookie noodle apple 
doc4 pizza milk 
. 
. 
. 

Mapper上記テキストファイルの各行を読み取り、(word, 1)を発します。しかし、Reducerは全単語に表示される各単語の数を知っている必要があります。たとえば、「りんご」の場合はdoc1、doc2、doc3にありますので、Reducerには「3」が必要です。

は私が考えていることは、このようなものです:行われているすべてのMapperの仕事の後に実行するように 開始Reducerので、MapperHashMapそれが(word, 1)発するたびの価値を高める数えることができます。たとえば、Mapperdoc1となっている場合は、内容全体が一意の単語(=> appleピザ)になります。そして、それが(word, 1)、つまり(apple, 1)と発するたびに、hashMap['apple'] ++を実行します。

そして、Mapperの仕事が完了した後には、ReducerこのHashMapにアクセスすると、各単語がドキュメント全体に何回出現するかを使用できるようになります。

私はHow to share a variable in Mapper and Reducer class?について読んだことがありますが、私はあなたからアドバイスを受けたいと思います。

p.s申し訳ありませんが、英語は貧弱ですが、私はネイティブではありません。私が言っていることを理解できない場合は、コメントしてください。

答えて

0

ここで何をしているのか正確にはわかりません。

これはどのような目標ですか? このように動作するように起こっているすべてのあなたのレコードにすべての単語を持って何回カウントすることである場合:

マッパー:すべてのキーがキーでソートされますマップ後

function map(){ 
    String[] arr = line.split(" "); 
    foreach(String word : arr){ 
    context.write(word,1) 
    } 
} 

、グループ化されています。 これは非常に重要な機能です。

例:ドキュメントはキーによってグループ化されるマッパー後

Mapper: 
    doc1 will produce: 
    apple 1 
    pizza 1 
    apple 1 

: リンゴ=> [1,1] ピザ=> [1]

減速:

function reduce(apple, [1,1]){ 

     count=0; 
     foreach(value in values) do: 
      count++ 
     done 

     context.write(key,count) ; //Here you will have the number of apples 
    in all your docs 
} 
関連する問題