Присоединение к карте
При объединении на стороне карты (фрагмент-копия) вы удерживаете один набор данных в памяти (скажем, в хэш-таблице) и присоединяетесь к другому набору данных, запись за записью. В Pig вы бы написали
edges_from_list = JOIN a_follows_b BY user_a_id, some_list BY user_id using 'replicated';
, следя за тем, чтобы меньший набор данных находился справа . Это чрезвычайно эффективно, так как нет нагрузки на сеть и минимальной нагрузки на процессор.
Уменьшение присоединения
В соединении на стороне сокращения вы группируете по ключу соединения, используя стандартную сортировку слиянием hadoop.
<user_id {A, B, F, ..., Z}, { A, C, G, ..., Q} >
и создать запись для каждой пары элементов из первого набора с элементом из второго набора:
[A user_id A]
[A user_id C]
...
[A user_id Q]
...
[Z user_id Q]
Вы должны спроектировать свои ключи так, чтобы набор данных с наименьшим количеством записей на ключ был первым - вам нужно удерживать первую группу в памяти и передавать вторую за ней. В Pig для стандартного объединения вы выполняете это, поставляя самый большой набор данных последним. (В отличие от соединения фрагмент-реплика, где набор данных в памяти дается последним).
Обратите внимание, что для присоединения на стороне карты всего меньшего набора данных должно помещаться в памяти. В стандартном соединении на стороне редукции в память должны помещаться только группы каждого ключа (фактически, каждая группа ключей, кроме последней). Можно даже обойти это ограничение, но оно требует осторожности; посмотрите, например, скошенное соединение в Pig.
Объединить объединение
Наконец, если оба набора данных хранятся в порядке сортировки итогов на ключе соединения, вы можете выполнить объединение слиянием на стороне карты. Аналогично соединению на стороне редукции, вы выполняете сортировку слиянием для cogroup на ключе соединения, а затем проецируете (выравниваете) обратно на пары.
Из-за этого при генерации часто читаемого набора данных часто хорошей идеей является полная сортировка в последнем проходе. Зебра и другие базы данных могут также предоставить вам полностью отсортированный ввод (почти) бесплатно.