Я изучаю Python и Hadoop. Я завершил установку и основные примеры, представленные на официальном сайте, используя потоки pythong + hadoop. Я рассмотрел возможность внедрения двух файлов. Я завершил equi-join, который проверяет, появляется ли тот же самый ключ в обоих входных файлах, затем выводит ключ вместе со значениями из файла 1 и файла 2 в этом порядке. Соединение равенства работает так, как предполагается.
Теперь я хочу сделать соединение неравенства, которое предполагает поиск Cross Product перед применением условия неравенства. Я использую тот же mapper (мне нужно его изменить), и я изменил редуктор так, чтобы он содержал вложенный цикл (так как каждая пара значений ключа в файле1 должна быть сопоставлена со всеми парами значений ключа в файле2). Это не работает, так как вы можете проходить через поток только один раз. Теперь я подумал о возможности хранения "некоторых" значений в редукторе и их сравнении, но я понятия не имею, "как" многие. Наивный метод заключается в том, чтобы хранить весь контент file2 в массиве (или подобной структуре), но это глупо и противоречит идее распределенной обработки. Наконец, мои вопросы:
-
Как сохранить значения в редукторе, чтобы у меня было перекрестное произведение между двумя файлами?
-
В equi-join Hadoop, кажется, посылает все ключевые пары значений с одним и тем же ключом на тот же редуктор, который отлично работает и хорошо работает для этого случая. Однако как я могу изменить это поведение (если необходимо), так что требуемая группировка пар ключ-значение будет правильным редуктором?
Примеры файлов: http://pastebin.com/ufYydiPu
Python Map/Reduce Scripts: http://pastebin.com/kEJwd2u1
Команда Hadoop Я использую:
bin/hadoop jar contrib/streaming/hadoop-*streaming*.jar -file /home/hduser/mapper.py -mapper mapper.py -file /home/hduser/ireducer.py -reducer reducer.py -input /user/hduser/inputfiles/* -output /user/hduser/join-output
Любая помощь/подсказка очень ценится.