这个MRJob示例的说明

时间:2015-10-20 02:47:29

标签: python-2.7 hadoop mapreduce 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定义在哪里?

1 个答案:

答案 0 :(得分:1)

嗯,简短的回答是,这个例子并不计算包含' 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 Commands as Steps中所述的本地跑步者在' Kitty'的英文维基百科页面上运行它,那么我会计算所有包含'小猫'正如所料:

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

看起来你从mrjob docs中引用的例子是错误的。