2015-06-16 2 views
4

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

Что это означает, что кластеризовано более чем на один столбец? Например, скажем, что таблица имеет CLUSTERED BY (континент, страна) INTO 32 BUCKETS.

Как выполнить функцию хэша, если имеется более одного столбца?

Сколько файлов будет сгенерировано? Это еще 32?

ответ

4
  1. Да количество файлов все равно будет 32.
  2. функция хеширования будет работать с учетом «континент, страна» в виде одной строки, а затем будет использовать это в качестве входных данных.

Надеюсь, это поможет!

+0

Спасибо @Maddy. Значит, это также означает, что когда соединение должно выполняться как на континенте, так и в стране? Будет ли он иметь те же преимущества в производительности, если соединение выполняется только на одном столбце, например, в стране? – learninghuman

+1

Если bucketing применяется в двух столбцах как составной, то объединение в виде корзины будет полезно только тогда, когда вы используете оба столбца в качестве критериев присоединения. Это не поможет, если вы используете только один из них (например, страна в этом случае) в качестве критерия объединения. –

+0

Не может ли это поведение контролироваться нами в отношении того, что должно произойти? –

0

В общем, номер ведра определяется выражением hash_function (bucketing_column) mod num_buckets. (Там тоже есть «0x7FFFFFFF», но это не так важно). Функция hash_function зависит от типа столбца bucketing. Для int это легко, hash_int (i) == i. Например, если user_id был int, и было 10 ведер, мы ожидаем, что все user_id, которые заканчиваются в 0, будут в bucket 1, все user_id, которые заканчиваются в 1, чтобы быть в ведре 2 и т. Д. Для других типов данных это немного сложнее. В частности, хэш BIGINT - это не то же самое, что BIGINT. И хэш строки или сложного типа данных будет некоторым числом, полученным из значения, но не каким-либо человекознаваемым. Например, если user_id был STRING, то user_id в bucket 1, вероятно, не закончится в 0. В общем случае распределение строк на основе хэша даст вам равномерное распределение в ведрах.

исх: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL+BucketedTables

+0

мой вопрос был больше о ситуации, когда в bucketing есть два столбца. – learninghuman

+0

Да, я понял вопрос. поскольку мы знаем, что если мы не установим hive.enforce.bucketing = true; количество запущенных редукторов будет равно количеству ведер. поэтому в этом случае да будет создавать только 32. –