Конечно, особенно если вы не заботитесь о порядке строк.
Во-первых, ваш маппер должен выдавать (line, filename)
пары:
File A:
(0, "A 1")→("A 1", A)
(4, "B 2")→("B 2", A)
(8, "C 3")→("C 3", A)
File B:
(0, "A 1")→("A 1", B)
(4, "C 3")→("C 3", B)
(8, "D 4")→("D 4", B)
(Предполагается, что вы 'повторно используя TextInputFormat
в качестве InputFormat, поэтому входящий ключ - это позиция в файле. Вы можете получить имя файла с ((FileSplit) context.getInputSplit()).getPath()
в функции карты.)
В уменьшенииНа этапе Hadoop соберет значения (имена файлов), связанные с каждым ключом (строкой), и передаст их вашему редуктору.В вашем редукторе вы должны испускать только те строки, которые имеют только имя файла A , и ничего не испускают для остальных:
("A 1",{A,B})→nothing
("B 2",{A})→"B 2"
("C 3",{A,B})→nothing
("D 4",{B})→nothing
Результатом будут только строки, которыенаходятся только в файле A .