gpt4 book ai didi

python - MRJob 排序 reducer 输出

转载 作者:行者123 更新时间:2023-12-04 16:43:59 27 4
gpt4 key购买 nike

有没有办法使用mrjob对reducer函数的输出进行排序?

我认为 reducer 函数的输入是按键排序的,我尝试利用此功能使用另一个 reducer 对输出进行排序,如下所示,我知道值具有数值,我想计算每个键的数量并排序根据此计数的键:

def mapper_1(self, key, line):
key = #extract key from the line
yield (key, 1)

def reducer_1(self, key, values):
yield key, sum(values)

def mapper_2(self, key, count):
yield ('%020d' % int(count), key)

def reducer_2(self, count, keys):
for key in keys:
yield key, int(count)

但它的输出没有正确排序!我怀疑这种奇怪的行为是由于将 ints 操作为 string 并试图将其格式化为 this link说但是没用!

重要提示:当我使用调试器查看 reducer_2 的输出顺序时,该顺序是正确的,但作为输出打印的却是另一回事!!!

重要提示 2:在另一台计算机上,相同数据的相同程序返回按预期排序的输出!

最佳答案

您可以在第二个 reducer 中将值排序为整数,然后将它们转换为零填充表示:

import re

from mrjob.job import MRJob
from mrjob.step import MRStep

WORD_RE = re.compile(r"[\w']+")


class MRWordFrequencyCount(MRJob):

def steps(self):
return [
MRStep(
mapper=self.mapper_extract_words, combiner=self.combine_word_counts,
reducer=self.reducer_sum_word_counts
),
MRStep(
reducer=self.reduce_sort_counts
)
]

def mapper_extract_words(self, _, line):
for word in WORD_RE.findall(line):
yield word.lower(), 1

def combine_word_counts(self, word, counts):
yield word, sum(counts)

def reducer_sum_word_counts(self, key, values):
yield None, (sum(values), key)

def reduce_sort_counts(self, _, word_counts):
for count, key in sorted(word_counts, reverse=True):
yield ('%020d' % int(count), key)

嗯,这是在内存中对输出进行排序,这可能是一个问题,具体取决于输入的大小。但是你希望它被排序,所以它必须以某种方式排序。

关于python - MRJob 排序 reducer 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53707962/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com