2013-07-10 5 views
1

Я хотел бы выполнить сортировки слияния, как описано в руководстве Hive (Bucketed Map Join), используя следующие параметрыВхода для карты сортировки слияния ведра присоединиться Улем

set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat; 
set hive.optimize.bucketmapjoin = true; 
set hive.optimize.bucketmapjoin.sortedmerge = true; 

Обе таблицы должна быть bucketed и упорядоченные в столбце объединения. Мой вопрос: должен ли быть сорт глобальным, т. Е. Ключи в первом ковше меньше, чем ключи во втором ковше, или достаточно, чтобы сортировка каждого ведра?

ответ

5

Вы должны определить таблицы, которые должны быть CLUSTERED BY той же колонке и SORTED BY той же колонке в том же порядке INTO такое же количество ведер.
Затем вы должны установить вышеуказанные настройки, как вы уже указали И написать подсказку /*+MAPJOIN(x)*/ где x - одна из таблиц.
Кроме того, обе таблицы должны быть объединены как AS IS в условии соединения, и вы не можете использовать их в подзапросе перед соединением, потому что данные не будут ведрами и отсортированы после первого запроса, который происходит первым.
И, наконец, столбцы соединения должны быть теми, в которых таблицы находятся в ведомости/сортируются.

Когда вы вставляете данные в таблицы, вы можете либо установить hive.enforce.sorting (установите значение true), либо вручную введите команду сортировки.
Улей не проверяет, действительно ли сортируются ведра, поэтому, если они не могут вызвать неправильных результатов на выходе.

Каждый картограф будет считывать ведро из первой таблицы и соответствующее ведро со второго, и он будет выполнять объединение типа сортировки.

На ваш вопрос - Нет, они не должны сортироваться по всему миру.

P.S.
Перед выполнением запроса вы должны выдать команду EXPLAIN, и вы увидите, будет ли улей планировать объединение Merge-sort bucket или нет.

+0

Отлично! У вас есть пример полного запроса? – javadba

Смежные вопросы