Alg*_*Man 3 python hadoop mapreduce
我有一个输出 key 和 value 的映射器,它被排序并通过管道传输到 reducer.py ,
由于键已经排序,在我到达 reducer 之前,我想编写一个组合器,它遍历排序列表并输出 key , [ v1,v2,v3] 对,将在 reducer 中使用。
猫数据| python mapper.py | 排序 | 蟒蛇减速器.py
编写减速器的最佳机制是什么,这样我就不会使用包含所有键的字典,大量内存来保存字典中的条目。
>>> import itertools
>>> import operator
>>> foo = [("a", 1), ("a", 2), ("b", 1), ("c", 1), ("c", 2)]
>>> for group in itertools.groupby(foo, operator.itemgetter(0)):
... print group[0], list(map(operator.itemgetter(1), group[1]))
...
a [1, 2]
b [1]
c [1, 2]
Run Code Online (Sandbox Code Playgroud)
解释:
groupby,顾名思义,根据一些关键功能将可迭代的元素分组为块。也就是说,它调用keyfunc可迭代对象的第一个元素,然后从可迭代对象中一个一个地拉出元素,直到值发生keyfunc变化,此时它会产生到目前为止它已经得到的所有元素,并从新的键开始重新开始。它也是明智的,不会消耗过多的内存;一旦产生了值,它们就不再被groupby.
在这里,我们将输入的元素按 分组operator.itemgetter(0),这是一个有用的“工具箱”函数,它映射x到x[0]。换句话说,我们按元组的第一个元素进行分组,这是一个键。
自然,您将需要编写一个自定义生成器来处理读取输入(sys.stdin可能来自)并一一生成它们。幸运的是,这很容易,使用yield关键字。
另请注意,这假定键已排序。当然,如果它们没有被排序,你就无能为力:你需要查看输入的末尾,以确保你拥有给定键的所有值。