我正在研究mapreduce范式。 我正在尝试使用python和java做经典的单词计数练习。在Java中,随机排序和排序后的化简器输入为
(key1, [value1, value 2, ... , value n])
Reducer Java:
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int sum = 0;
for (IntWritable value : values){
sum += value.get();
}
context.write(key,new IntWritable(sum));
}
相反,python中的reducer输入是:
key1, value1
key1, value2
key1, value n
python中的缩减器:
values = defaultdict(int)
for line in sys.stdin:
word, count = line.split('\t', 1)
count = int(count)
values[word] = values[word]+count
for key,value in values.items():
print ('%s\t%s' % (key, value))
在python中,我使用hadoop-streaming.jar来启动地图缩小代码(https://hadoop.apache.org/docs/r1.2.1/streaming.html)
因此在python中,我必须在排序过程之后使用相同的键将代码写入“随机”值,但是在Java中,随机部分是自动的。似乎在python和java中的重排和排序是不同的。实际上,python会跳过值列表的改组。 是否可以像在Java中那样在python中进行随机排序和排序?
谢谢