gpt4 book ai didi

Python mrjob mapreduce如何对输入文件进行预处理

转载 作者:可可西里 更新时间:2023-11-01 16:06:24 27 4
gpt4 key购买 nike

我正在尝试预处理 XML 文件以在放入 mapreduce 之前提取某些节点。我有以下代码:

from mrjob.compat import jobconf_from_env
from mrjob.job import MRJob
from mrjob.util import cmd_line, bash_wrap

class MRCountLinesByFile(MRJob):
def configure_options(self):
super(MRCountLinesByFile, self).configure_options()
self.add_file_option('--filter')

def mapper_cmd(self):
cmd = cmd_line([self.options.filter, jobconf_from_env('mapreduce.map.input.file'])
return cmd



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

然后在命令行上,我输入:

python3 test_job_conf.py --filter ./filter.py -r local < test.txt

test.txt 是一个普通的 XML 文件,如 here .而filter.py是一个查找所有标题信息的脚本。

但是,我收到以下错误:

Creating temp directory /tmp/test_job_conf.vagrant.20160406.042648.689625
Running step 1 of 1...
Traceback (most recent call last):
File "./filter.py", line 8, in <module>
with open(filename) as f:
FileNotFoundError: [Errno 2] No such file or directory: 'None'
Step 1 of 1 failed: Command '['./filter.py', 'None']' returned non-zero exit status 1

在这种情况下,它看起来像 mapreduce.map.input.file render None。我怎样才能让 mapper_cmd 函数读取 mrjob 当前正在读取的文件?

最佳答案

根据我的理解,您的 self.add_file_option 应该包含文件的路径。

self.add_file_option('--items', help='Path to u.item')

我不太理解你的场景,但这是我的理解。您使用配置选项来确保将给定文件发送到所有映射器进行处理,例如,当您想要对源以外的另一个文件中的数据进行辅助查找时。这个辅助查找文件由 self.add_file_option('--items', help='Path to u.item') 提供。

要在 reducer 或 mapper 阶段之前预处理某些内容,您可以使用 reducer_init 或 mapper_init。这些初始化或处理步骤也需要在您的步骤函数中提及,例如如下所示。

def steps(self):
return [
MRStep(mapper=self.mapper_get_name,
reducer_init=self.reducer_init,
reducer=self.reducer_count_name),
MRStep(reducer = self.reducer_find_maxname)
]

在您的 init 函数中,您可以在发送到 mapper 或 reducer 之前对您需要做的事情进行实际的预处理。比如说打开一个文件 xyz 并将第一个字段中的值复制到我将在我的 reducer 中使用的另一个字段中并输出相同的值。

def reducer_init(self):
self.movieNames = {}
with open("xyz") as f:
for line in f:
fields = line.split('|')
self.myNames[fields[0]] = fields[1]

希望这对您有所帮助!

关于Python mrjob mapreduce如何对输入文件进行预处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36441527/

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