mrjob csv-файл add_file_arg () - PullRequest
0 голосов
/ 19 мая 2018

У меня проблемы с пониманием того, как использовать add_file_arg () для mrjob.Я пытаюсь передать CSV моему мапперу с атрибутами человека и найти атрибуты для каждого человека в моем маппере.Пока это мой код:

class MRPeopleScores(MRJob):
    def configure_args(self):
        super(MRPeopleScores, self).configure_args()
        self.add_file_arg('--database')

    def mapper(self, _, line):
        print(self.options.database)

Когда я запускаю

python3 calculate_people_scores.py --jobconf mapreduce.job.reduces=1 data/people_ids.csv database=data/people_attributes.csv

, я получаю следующее сообщение об ошибке:

Traceback (most recent call last):
File "calculate_people_scores.py", line 88, in <module>
MRPeopleScores.run()
File "/usr/local/lib/python3.6/site-packages/mrjob/job.py", line 439, in run
mr_job.execute()
File "/usr/local/lib/python3.6/site-packages/mrjob/job.py", line 460, in execute
super(MRJob, self).execute()
File "/usr/local/lib/python3.6/site-packages/mrjob/launch.py", line 161, in execute
self.run_job()
File "/usr/local/lib/python3.6/site-packages/mrjob/launch.py", line 231, in run_job
runner.run()
File "/usr/local/lib/python3.6/site-packages/mrjob/runner.py", line 476, in run
self._run()
File "/usr/local/lib/python3.6/site-packages/mrjob/sim.py", line 185, in _run
self._invoke_step(step_num, 'mapper')
File "/usr/local/lib/python3.6/site-packages/mrjob/sim.py", line 272, in _invoke_step
working_dir, env)
File "/usr/local/lib/python3.6/site-packages/mrjob/inline.py", line 154, in _run_step
child_instance.execute()
File "/usr/local/lib/python3.6/site-packages/mrjob/job.py", line 448, in execute
self.run_mapper(self.options.step_num)
File "/usr/local/lib/python3.6/site-packages/mrjob/job.py", line 526, in run_mapper
for out_key, out_value in mapper(key, value) or ():
File "calculate_people_scores.py", line 47, in mapper
print(self.options.database)
AttributeError: 'Values' object has no attribute 'database'

Я уверен, что я 'Я крайне недопонимаю, как использовать этот аргумент, любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 02 декабря 2018

Я думаю, вы должны сначала запустить --database data/people_attributes.csv вместо database=data/people_attributes.csv.

python3 calculate_people_scores.py --jobconf mapreduce.job.reduces=1 data/people_ids.csv --database data/people_attributes.csv

с передачей --database вы просто передаете путь к файлу, поэтому вам нужно сначала открыть его, прежде чем делатьничего с этим.Вы можете сделать это, переопределив функции reducer_init() или mapper_init() следующим образом:

def mapper_init(self):
    self.db=open(self.options.database)

или

def reducer_init(self):
    self.db=open(self.options.database)

теперь вы можете работать с self.db в вашем картридоре или редукторе.не рекомендуется print вывод картографа или редуктора, вместо этого следует использовать yield.с другой стороны, не рекомендуется печатать (или выдавать) ваш второй файл (self.db) в маппере или редукторе, потому что он будет работать столько же, сколько и мапперов или редукторов.но вы можете сделать это следующим образом:

def mapper(self, _, line):
     print(self.db.readlines())
     # OR
     yield(None,self.db.readlines())

в конце вы можете получить доступ к своему CSV-контенту так:

def mapper(self,_,line):
        for li in self.db:
            fields=li.split(',')
            yield(fields[0],fields[1])
...