java是Mapreduce中按值传递还是按引用传递的键?
我创建了一个MapReduce作业,该作业将计算键的数量,然后根据它们出现的次数对它们进行排序
处理输入时,如
1A99
1A34
1A99
1A99
1A34
1A12
最终目标将是一个类似
1A99 3
1A34 2
1A12 1
我的地图阶段输出a<;键,1>;类型<;文本,Int可写)
我的reduce阶段有3个阶段:设置阶段,初始化数组列表以保存我的<;Text,Int Wrtiable),然后是reduce阶段,我将Int writiable相加以获得计数,然后将其插入数组,最后是清理阶段,在清理阶段我按计数对arraylist排序
数组列表中的值是我创建的一个对象myObject的值,该对象在元组中保存可写的文本和Int,我发现这是一个奇怪的现象
new myObject(key, count)
- key是传递到reducer中的键,count是我通过求和值创建的int-writable(Iterable int-writable)
最后,数组中的所有键都是相同的键,而只有计数不同
但如果我这样做了
new myObject(new Text(key), count)
从本质上说,复制钥匙是可行的
我找不到任何关于从映射器传递到减速器的键是否通过引用的信息,但这似乎是唯一可能解释为什么会发生这种情况的解释
# 1 楼答案
不看实际的代码,理解实际的问题有点困难。然而,您似乎不需要reduce阶段的第1阶段和第3阶段。还原程序将得到一个
key
(Text
)和一个list of values
(Iterable<IntWritable>
)。这是在映射阶段之后发生的中间洗牌阶段的结果。在reduce步骤中,您应该对Iterable<IntWritable>
执行任何需要执行的操作(在您的例子中,将它们相加)。这意味着对该密钥的处理已经完成。使用context.write(key, result_of_operation)
,从reducer输出结果以下是数据集的处理方式:
可能有帮助的参考资料:
https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Example:_WordCount_v1.0