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是在哪里定义的?
发布于 2015-11-20 10:51:28
简而言之,本例不计算包含'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‘的英文维基百科页面的文本运行它,那么我会像预期的那样得到包含'kitty’的所有行的计数:
$ python grep_kitty.py -q -r local kitty.txt
20
$ grep -ci kitty kitty.txt
20看起来您从mrjob文档中引用的示例是错误的。
https://stackoverflow.com/questions/33227126
复制相似问题