我正在使用 yelps MRJob 库来实现映射缩减功能。我知道 MapReduce 有一个内部排序和洗牌算法,它根据键对值进行排序。所以如果我在地图阶段后得到以下结果
(1, 24) (4, 25) (3, 26)
我知道排序和洗牌阶段将产生以下输出
(1, 24) (3, 26) (4, 25)
正如预期的那样
但是,如果我有两个相似的键和不同的值,为什么排序和洗牌阶段会根据出现的第一个值对数据进行排序?
例如
如果我有来自映射器的以下值列表
(2, <25, 26>) (1, <24, 23>) (1, <23, 24>)
预期输出是
(1, <24, 23>) (1, <23, 24>) (2, <25, 26>)
但我得到的输出是
(1, <23, 24>) (1, <24, 23>) (2, <25, 26>)
这个 MRjob 库具体吗?无论如何,有没有办法停止这种基于值的排序?
CODE
from mrjob.job import MRJob
import math
class SortMR(MRJob):
def steps(self):
return [
self.mr(mapper=self.rangemr,
reducer=self.rangesort)]
def rangemr(self, key, line):
for a in line.split():
yield 1,a
def rangesort(self,numid,line):
for a in line:
yield(1, a)
if __name__ == '__main__':
SortMR.run()