gpt4 book ai didi

python - mrjob:示例如何自动知道如何在文本文件中查找行?

转载 作者:太空宇宙 更新时间:2023-11-03 13:44:29 24 4
gpt4 key购买 nike

我正在尝试更好地理解 mrjob 的示例

from mrjob.job import MRJob  
class MRWordFrequencyCount(MRJob):

def mapper(self, _, line):
yield "chars", len(line)
yield "words", len(line.split())
yield "lines", 1

def reducer(self, key, values):
yield key, sum(values)
if __name__ == '__main__':
MRWordFrequencyCount.run()

我运行它

$ python word_count.py my_file.txt

它按预期工作,但我不明白它是如何自动知道它将读取一个文本文件并将其按每一行拆分的。而且我也不确定 _ 做了什么。

据我了解,mapper() 为每一行生成三个键/值对,对吗?如果我想处理文件夹中的每个文件怎么办?

reducer() 自动知道如何将每个键的值相加?

如果我想通过 map reduce 运行单元测试,mapper 和 reducer 会是什么样子?甚至有必要吗?

最佳答案

映射器方法接收一个已经从输入文本中解析出来的键值对。 mrjob 使用 Hadoop 流式处理,每个输入文本被换行符分割,然后根据使用的输入协议(protocol)将每一行拆分为键值对。这是框架为您处理的事情,因此您不必做任何繁重的工作;您可以假设您将获得适当的 key 和值(value)。

但是,您确实需要指定指定的输入文本文件类型。例如,如果键和/或值不是纯文本(如在原始问题中)而是序列化的 JSON,则您使用 JSONProtocol/JSONValueProtocol 等,而不是默认的 RawValueProtocol。

对于初始映射器,每一行都被读入值(通过 RawValueProtocol),因此这就是您没有收到 key 的原因。使用 _ 只是一个未使用的虚拟变量的 Python 约定。 (但是,_ 实际上是 Python 变量的有效名称。您可以这样做 a = 3; _ = 2; b = a + _。亵渎神明,不是吗?)

mrjob 可以接受多个输入文件。例如你可以这样做

$ python wordcount.py text1.txt text2.txt

如果您希望所有文本文件都作为 mrjob 作业的输入,您可以执行以下操作

$ python wordcount.py inputdir/*.txt

或者只是简单地

$ python wordcount.py inputdir

所有选择的文件都用作输入。

reducer 接收的是一个键和与该键关联的所有值的迭代器。因此,如果您举个例子,reducer 方法中的变量 values 就是一个迭代器。如果你想对所有值做一些事情,你需要实际迭代所有这些值。在问题的具体示例中,内置函数 sum 可以将迭代器作为参数,这就是为什么您可以一次性完成的原因。但它实际上类似于 sum([value for value in values])

我实际上不知道您将如何对 mrjob 脚本进行单元测试。在生产运行之前,我通常只对一小部分测试数据进行测试。

关于python - mrjob:示例如何自动知道如何在文本文件中查找行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23192972/

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