Как бы вы предложили выполнить "Join" с потоковым Hadoop? - PullRequest
11 голосов
/ 13 ноября 2010

У меня есть два файла в следующих форматах:

field1, field2, field3
field4, field1, field5

Другой номер поля указывает на другое значение.

Я хочу объединить два файла, используя потоковую передачу Hadoop на основе взаимного поля (field1 в приведенном выше примере), поэтому на выходе получится field1, field2, field3, field4, field5 (остальные порядки в порядке, если они имеют все поля).

Ответы [ 2 ]

6 голосов
/ 15 ноября 2010

Hadoop имеет библиотеку под названием KeyFieldBasedPartitioner http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapred/lib/KeyFieldBasedPartitioner.html

Использование этого параметра в качестве опции при запуске вашей работы, так как разделитель для вашей потоковой работы позволяет разбить выходные данные преобразователя на пары ключ / значение и получить ключихешируется вместе, переходя к одному и тому же редуктору и сортируя, включая значения http://hadoop.apache.org/mapreduce/docs/r0.21.0/streaming.html#More+Usage+Examples

$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
-D stream.map.output.field.separator=. \
-D stream.num.map.output.key.fields=4 \
-D mapreduce.map.output.key.field.separator=. \
-D mapreduce.partition.keypartitioner.options=-k1,2 \
-D mapreduce.job.reduces=12 \
-input myInputDirs \
-output myOutputDir \
-mapper org.apache.hadoop.mapred.lib.IdentityMapper \
-reducer org.apache.hadoop.mapred.lib.IdentityReducer \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner 

Здесь -D stream.map.output.field.separator =.и -D stream.num.map.output.key.fields = 4 объясняются здесь http://hadoop.apache.org/mapreduce/docs/r0.21.0/streaming.html#Customizing+How+Lines+are+Split+into+Key%2FValue+Pairs в основном это то, как вы вывели поля сопоставления для определения пар ключ / значение.

Ключи вывода карты указанного выше задания MapReduce обычно имеют четыре поля, разделенных ".".Однако платформа MapReduce будет разделять выходные данные карты по первым двум полям ключей, используя опцию -D mapreduce.partition.keypartitioner.options = -k1,2.Здесь -D mapreduce.map.output.key.field.separator =.определяет разделитель для раздела.Это гарантирует, что все пары ключ / значение с одинаковыми первыми двумя полями в ключах будут разделены на один и тот же редуктор.

Это фактически эквивалентно указанию первых двух полей в качестве первичного ключа и следующих двухполя как вторичные.Первичный ключ используется для разделения, а комбинация первичного и вторичного ключей используется для сортировки.

Чтобы выполнить объединение, достаточно просто вывести поля из сопоставителя и задать параметрыпри запуске вашей конфигурации для полей, которые являются ключами, и в редукторе все ваши значения будут соответствующим образом соединены ключом.Если вы хотите получать данные из нескольких источников, просто продолжайте добавлять больше -input в командной строке ... если они имеют различную длину ввода, то в вашем преобразователе вы можете распознать это и создать стандартный формат вывода из преобразователя.

0 голосов
/ 16 февраля 2011

Каскадирование предоставляет полезные абстракции для фильтрации, объединения и группировки по полю.https://stackoverflow.com/questions/4626356 ссылки на полезный пример того, как использовать потоковую передачу Hadoop в Cascading.

...