Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python mrjob mapreduce如何预处理输入文件_Python_Hadoop_Mrjob_Bigdata - Fatal编程技术网

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

Python mrjob mapreduce如何预处理输入文件,python,hadoop,mrjob,bigdata,Python,Hadoop,Mrjob,Bigdata,我正在尝试预处理一个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(MRCountLi

我正在尝试预处理一个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

在本例中,它看起来像
mapreduce.map.input.file
render
None
。如何让
mapper\u cmd
函数读取
mrjob
当前正在读取的文件

根据我的理解,在your self.add_file_选项中应该有文件的路径

self.add_file_option('--items', help='Path to u.item')
我不太明白你的想法,但这是我的理解。 使用“配置”选项可确保将给定文件发送给所有映射器进行处理,例如,当您要对源以外的其他文件中的数据执行辅助查找时。此辅助查找文件由self.add_file_选项('--items',help='Path to u.item')提供

要在reducer或mapper阶段之前预处理某些内容,可以使用reducer\u init或mapper\u 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]

希望这有帮助

根据我的理解,在your self.add_file_选项中应该有文件的路径

self.add_file_option('--items', help='Path to u.item')
我不太明白你的想法,但这是我的理解。 使用“配置”选项可确保将给定文件发送给所有映射器进行处理,例如,当您要对源以外的其他文件中的数据执行辅助查找时。此辅助查找文件由self.add_file_选项('--items',help='Path to u.item')提供

要在reducer或mapper阶段之前预处理某些内容,可以使用reducer\u init或mapper\u 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]
希望这有帮助