我使用Java
,Hadoop
代表MapReduce
。
输入(txt
文件):
doc1 apple pizza apple
doc2 pear apple
doc3 cookie noodle apple
doc4 pizza milk
.
.
.
Mapper
读取上面文本文件的每一行并发出(word, 1)
。但是,因为Reducer
应该知道每个单词在WHOLE文档中出现的数量。例如,在" apple"的情况下,它出现在doc1,doc2,doc3以及' 3'需要Reducer
。
我想的是这样的:
自Reducer
所有Mapper
工作完成后Mapper
开始运行,HashMap
每次发出(word, 1)
时都会计算Mapper
的值增加。例如,当doc1
读取(word, 1)
行时,它会将整个内容设为唯一字词(=> apple pizza)。每次发出(apple, 1)
时,请hashMap['apple'] ++
,Mapper
。
在完成所有Reducer
个工作后,HashMap
访问此(@movies + @pictures).sort_by { |model| model.created_at }
,以便它可以使用每个单词在整个文档中出现的次数。
我已经阅读了How to share a variable in Mapper and Reducer class?,但我希望得到你们的意见。
p.s抱歉英语不好,但我不是本地人。请注意,如果你不明白我在说什么。
答案 0 :(得分: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
在映射器之后,文档将按键分组: apple => [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
}