这个MRJob示例的解释


from mrjob.job import job

class KittyJob(MRJob):
    OUTPUT_PROTOCOL = JSONValueProtocol
    def mapper_cmd(self):
        return "grep kitty"
    def reducer(self, key, values):
        yield None, sum(1 for _ in values)

if __name__ == '__main__':
    KittyJob().run()

来源:https://mrjob.readthedocs.org/en/latest/guides/writing-mrjobs.html#protocols

这段代码是如何完成计算包含kitty的行数的任务的?

OUTPUT_PROTOCOL在哪里定义?

好吧,简短的回答是,这个例子不计算包含'kitty'的行。

下面是一些使用过滤器的代码,对包含(不区分大小写)kitty的行进行计数:

from mrjob.job import MRJob
from mrjob.protocol import JSONValueProtocol
from mrjob.step import MRStep
class KittyJob(MRJob):
    OUTPUT_PROTOCOL = JSONValueProtocol
    def mapper(self, _, line):
        yield 'kitty', 1
    def sum_kitties(self, key, values):
        yield None, sum(values)
    def steps(self):
        return [
            MRStep(mapper_pre_filter='grep -i "kitty"',
                   mapper=self.mapper,
                   reducer=self.sum_kitties)]
if __name__ == '__main__':
    KittyJob().run()

如果我使用Shell命令中提到的本地运行程序在英文维基百科页面的"Kitty"文本上运行它,那么我将得到包含"Kitty"的所有行数:

$ python grep_kitty.py -q -r local kitty.txt
20
$ grep -ci kitty kitty.txt
20

看起来你从mrjob文档中引用的例子是错误的

相关内容

  • 没有找到相关文章

最新更新