Улей сгруппирован более чем по одному столбцу

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

Что означает кластеризация по более чем одному столбцу? Например, предположим, что таблица СКЛАДИРОВАНА ПО (континент, страна) В 32 ВЕДРА.

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

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


person Manikandan Kannan    schedule 16.06.2015    source источник


Ответы (2)


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

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

person Maddy RS    schedule 17.06.2015
comment
Спасибо @ Мэдди. То есть это также означает, что когда объединение должно выполняться как на континенте, так и в стране? Будет ли такой же выигрыш в производительности, если соединение будет выполняться только для одного столбца, скажем, для страны? - person Manikandan Kannan; 17.06.2015
comment
Если группирование применяется к двум столбцам как к составному, то объединение карты сегментов будет полезно только в том случае, если вы используете оба столбца в качестве критериев объединения. Это не поможет, если вы используете только один из них (в данном случае страну) в качестве критерия присоединения. - person Maddy RS; 18.06.2015
comment
Это поведение не может контролироваться нами относительно того, что должно произойти?? - person Utkarsh Saraf; 25.04.2017

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

ссылка: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL+BucketedTables

person krishna.kadigari    schedule 16.06.2015
comment
мой вопрос больше касался ситуации, когда в группировке участвуют две колонки. - person Manikandan Kannan; 16.06.2015
comment
Да я понял вопрос. так как мы знаем, что если мы не установим hive.enforce.bucketing = true; количество запущенных редукторов будет равно количеству ковшей. так что в этом случае да, он создаст только 32. - person krishna.kadigari; 16.06.2015