#python #hadoop #hadoop-streaming
#python #hadoop #потоковая передача hadoop
Вопрос:
Я хочу объединить несколько наборов данных перед отправкой выходных данных в код reducer python. Вот мои наборы данных:
student.dat
studentid:gender:age
grades.dat
studentid:subjectid:grade:semester:schoolyear
subject.dat
subjectid:name
Я хочу получить такой результат:
studentid gender name grade
Чтобы получить результат, приведенный выше, я подумал о запуске 2 циклов for, чтобы я мог сначала сохранить в dict набор данных предмета, затем я объединю наборы данных student и grades, затем перед печатью вывода я получу имя предмета из dict, чтобы я мог соединить его сдругие значения для создания окончательной структуры, которую мне нужно отправить в мой редуктор.
вот код:
mappper.py
#!/usr/bin/env python
import sys
subjectDict = {}
for line in sys.stdin:
line = line.strip()
line = line.split(":")
if len(line) == 2:
#subject
subjectDict[line[0]] = line[1]
for line in sys.stdin:
line = line.strip()
line = line.split("::")
if len(line) == 3:
#student
studentid = line[0]
gender = line[1]
elif len(line) == 5:
#grades
studentid = line[0]
subjectid = line[1]
grade = line[2]
name = subjectDict.get(subjectid)
print '%s|%s|%s|%s' % (studentid, gender, name, grade)
Когда я запускаю его локально (используя cat), я не получаю никаких результатов. Похоже, что выполняется только первый цикл for . Я еще не очень хорошо знаком с потоковой передачей Python hadoop. Чего мне здесь не хватает? Единственное ограничение, которое у меня здесь есть, это то, что мне нужно написать это в одном коде картографа python.
Как объединить эти наборы данных?
Кстати, просто для дополнительной информации, это будет вывод редуктора
Вывод редуктора может быть (среднее значение полового имени):
F Mathematics 4.8
M Science 4.5
Комментарии:
1. То, чего вы пытаетесь достичь, обычно называется объединением на стороне уменьшения в MapReduce. Таким образом, ваша карта должна выводиться
studentid
в качестве ключа, и вы объединяете поля вместе в reduce.2. @binary-nerd Итак, вы хотите сказать, что в mapper я должен присоединиться к набору данных student и grades и использовать studentid в качестве ключа. Затем в процессе сокращения я присоединюсь к предметному набору данных? Как тогда редуктор получит набор данных объекта?