Повторное выполнение цикла в коде Mapper с использованием потоковой передачи Hadoop

#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 в качестве ключа. Затем в процессе сокращения я присоединюсь к предметному набору данных? Как тогда редуктор получит набор данных объекта?