Вы должны воспользоваться Редуктором, чтобы сделать эквивалент сортировки -u для каждого поля.Вам нужно будет сделать одну работу M / R на поле.Вы должны сделать поле сопоставления ключа в маппере, затем в редукторе вы получите все записи с одинаковым именем, сгруппированные вместе, и сможете пометить их.Второй проход будет для телефона и т. Д. В зависимости от размера вашего кластера каждый проход должен быть очень быстрым.
Edit : @Olaf указал, что OP, вероятно, хочет абсолютно уникальные записи.Используя составной ключ, это может быть однострочная команда потоковой передачи hadoop для получения уникального набора.Я добавлю это в ближайшее время.
Edit2 : Обещанная потоковая команда, которая выполнит сортировку -u для всего файла.Предполагается, что у вас есть файл с записями с каждым полем (имя, отчество, номер телефона и адрес), по одной на каждой строке табуляции, разделенных одним или несколькими файлами в директории hdfs: // example / dedup / input /.Фактический путь hdfs может быть любым, или вы можете использовать один файл.Выводом будет несколько файлов part- * в hdfs: // example / dedup / output /.Вам также может понадобиться изменить команду, так как ваш hadoop-streaming.jar может находиться в немного другом месте.Если у вас более 4 полей, измените значение stream.num.map.output.key.fields.
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \
-input hdfs://example/dedup/input/ -output hdfs://example/dedup/output/ \
-mapper org.apache.hadoop.mapred.lib.IdentityMapper \
-reducer /usr/bin/uniq \
-D stream.num.map.output.key.fields=4
Чтобы извлечь уникальные результаты в файл в файле локальной файловой системы, запустите:поэтому каждая строка будет иметь дополнительную вкладку в конце.Это легко сдирать.
Если вы хотите сделать больше, чем просто получить вывод uniq, вы можете поместить свой собственный класс Java или программу командной строки вместо использования / usr / bin / uniq.Этот класс может, например, обновить все записи, которые вы найдете, дублируя, добавив пятый столбец в ваш ввод, который является идентификатором БД записей.Hadoop по умолчанию создает разделы по всему ключу, поэтому каждая группа повторяющихся записей будет передаваться вместе по редуктору, и все это будет происходить параллельно.Пожалуйста, ознакомьтесь с потоковой документацией для получения дополнительной информации.