Разбор HTML .txt файлов в Hadoop через MapReduce с использованием Python
Я очень плохо знаком с использованием платформы Hadoop и определением функций MapReduce, и мне трудно понять, почему этот маппер не работает в моем скрипте MapReduce. Я пытаюсь проанализировать коллекцию страниц, записанных в виде строки в файле.txt, где каждая "строка" представляет <page>...</page>
, Что неверного в этом скрипте? Спасибо вам за помощь!
from mrjob.job import MRJob
from mrjob.step import MRStep
from mrjob.compat import jobconf_from_env
import lxml
import mwparserfromhell
import heapq
import re
class MRParser(MRJob):
def mapper(self, _, line):
bigString = ''.join(re.findall(r'(<text xml:space="preserve">.*</text>)',line))
root = etree.fromstring(bigString.decode('utf-8'))
if not(bigString == ''):
bigString = etree.tostring(root,method='text', encoding = "UTF-8")
wikicode = mwparserfromhell.parse(bigString)
bigString = wikicode.strip_code()
yield None, bigString
def steps(self):
return [
MRStep(mapper=self.mapper)
]
1 ответ
Вам не хватает функции редуктора. Вам нужно будет передать линию от вашего картографа как "ключ" (без значений) в редуктор. Попробуй это:
def mapper(self, _, line):
bigString = ''.join(re.findall(r'(<text xml:space="preserve">.*</text>)',line))
root = etree.fromstring(bigString.decode('utf-8'))
if not(bigString == ''):
bigString = etree.tostring(root,method='text', encoding = "UTF-8")
wikicode = mwparserfromhell.parse(bigString)
bigString = wikicode.strip_code()
yield bigString, None
def reducer(self, key, values):
yield key, None
def steps(self):
return [
MRStep(mapper=self.mapper, reducer=self.reducer)
]