В чем разница между разделением и выпуклостью таблицы в Hive?


Я знаю, что оба выполняются на столбце в таблице, но как каждая операция отличается.

5 100

5 ответов:

перегородки данные часто используются для горизонтального распределения нагрузки, это имеет преимущество в производительности и помогает организовать данные логическим образом. пример: если мы имеем дело с большим employee таблица и часто запускать запросы с WHERE предложения, которые ограничивают результаты для конкретной страны или департамента . Для более быстрого ответа на запрос таблица Hive может быть PARTITIONED BY (country STRING, DEPT STRING). Секционирование таблиц изменения как улей структур хранения данных и куст будет Теперь создайте подкаталоги, отражающие структуру секционирования, например

.../ сотрудники/ страна=ABC / DEPT=XYZ.

если ограничения запроса для сотрудника от country=ABC, он будет сканировать только содержимое одного каталога country=ABC. Это может значительно повысить производительность запроса, но только если схема секционирования отражает общую фильтрацию. Функция секционирования очень полезна в Hive, однако дизайн, который создает слишком много разделов, может оптимизируйте некоторые запросы, но наносите ущерб другим важным запросам. Другим недостатком слишком большого количества разделов является большое количество файлов и каталогов Hadoop, которые создаются излишне и накладные расходы на NameNode, поскольку он должен хранить все метаданные для файловой системы в памяти.

Bucketing это еще один метод для разложения наборов данных на более управляемые части. Например, предположим, что таблица использует date как раздел верхнего уровня и employee_id как раздел второго уровня приводит к слишком большому количеству небольших разделов. Вместо этого, если мы ведро таблицы сотрудников и использовать employee_id в качестве столбца bucketing значение этого столбца будет хэшироваться определенным пользователем числом в ведра. Записи с тем же employee_id всегда будет храниться в том же ведре. Предполагая, что количество employee_id гораздо больше, чем количество ведер, каждое ведро будет иметь много employee_id. При создании таблицы вы можете указать как CLUSTERED BY (employee_id) INTO XX BUCKETS; где XX-количество ведер . Сегментация имеет ряд преимуществ. Количество ведер фиксировано, поэтому оно не колеблется с данными. Если две таблицы скрепленыemployee_id, улей может создать логически правильную выборку. Сегментация также способствует эффективные карте-соединения на стороне и т. д.

есть несколько деталей, отсутствующих в предыдущих объяснениях. Чтобы лучше понять, как работает секционирование и букетирование, вы должны посмотреть, как данные хранятся в hive. Допустим у вас есть таблица

CREATE TABLE mytable ( 
         name string,
         city string,
         employee_id int ) 
PARTITIONED BY (year STRING, month STRING, day STRING) 
CLUSTERED BY (employee_id) INTO 256 BUCKETS

тогда hive будет хранить данные в иерархии каталогов, как

/user/hive/warehouse/mytable/y=2015/m=12/d=02

таким образом, вы должны быть осторожны при разделении, потому что если вы, например, раздел по employee_id и у вас есть миллионы сотрудников, вы в конечном итоге будете иметь миллионы каталогов в вашей файловой системе. Термин'мощностью' относится к числу возможных значений поля. Например, если у вас есть поле "страна", страны в мире составляют около 300, поэтому мощность будет ~300. Для такого поля, как "timestamp_ms", которое меняется каждую миллисекунду, мощность может быть миллиардами. В общем, при выборе поля для секционирования он не должен иметь высокой мощности, потому что вы получите слишком много каталогов в вашем файле система.

кластеризация aka bucketing с другой стороны, приведет к фиксированному количеству файлов, так как вы указываете количество ведер. То, что сделает hive, - это взять поле, вычислить хэш и назначить запись этому ведру. Но что произойдет, если вы используете, скажем, 256 ведер, а поле, на котором вы закрепляете, имеет низкую мощность (например, это состояние США, поэтому может быть только 50 разных значений) ? У вас будет 50 ведер с данными и 206 ведер без данных данные.

кто-то уже упоминал, как перегородки могут значительно сократить объем данных, которые вы запрашиваете. Поэтому в моей таблице примеров, если вы хотите запрашивать только с определенной даты вперед, разбиение на год/месяц/день резко сократит количество ввода-вывода. Я думаю, что кто-то упомянул, как сегментация может ускорить соединения с другими таблицами которые имеют точно такой же bucketing, так что в моем примере, если вы соединяете две таблицы на одном ид_сотрудника, hive может выполнять соединение ведро за ведром(даже лучше, если они уже отсортированы по employee_id, так как он будет объединять части, которые уже отсортированы, что работает в линейном времени aka O (n) ).

таким образом, bucketing хорошо работает, когда поле имеет высокую мощность и данные равномерно распределены между ведрами. Секционирование работает лучше всего, когда мощность поля секционирования не слишком высока.

и вы можете разбить на несколько полей, С целью (год/месяц/день является хорошим примером), в то время как вы можете ведро только на одном поле.

Я думаю, что я опоздал с ответом на этот вопрос, но он продолжает появляться в моем канале.

Navneet предоставил отличный ответ. Добавление к нему визуально.

секционирование помогает в устранении данных, если они используются в предложении WHERE, где as bucketing помогает организовать данные в каждом разделе в несколько файлов, так как один и тот же набор данных всегда записывается в одно и то же ведро. Очень помогает в соединении колонок.

Предположим, у вас есть таблица с пятью столбцами, имя, server_date, some_col3, some_col4 и some_col5. Предположим, вы разбили таблицу на server_date и пристегнулся имя столбец в 10 ведер, ваша структура файла будет выглядеть примерно так, как показано ниже.

  1. server_date=xyz
    • 00000_0
    • 00001_0
    • 00002_0
    • ........
    • 00010_0

здесь server_date=xyz - это раздел и 000 файлы-это ведра в каждом разделе. Ведра вычисляются на основе некоторых хэш-функций, поэтому строки с имя=песчаном всегда будет идти в том же ведре.

Разделение Куста:

раздел делит большой объем данных на несколько срезов на основе значения столбца(ов) таблицы.

предположим, что вы храните информацию о людях во всем мире, распространенную по 196+ странам, охватывающим около 500 кроров записей. Если вы хотите запросить людей из определенной страны (Ватикан), в отсутствие разделения, вы должны сканировать все 500 кроров записей даже для получения тысячи записей страны. Если вы разделяете таблицу на основе страны, вы можете точно настроить процесс запроса, просто проверив данные только для одного раздела страны. Раздел Hive создает отдельный каталог для значения столбца(столбцов).

плюсы:

  1. распределить нагрузку выполнения по горизонтали
  2. более быстрое выполнение запросов в случае раздела с малым объемом данных. например, получить население от "Ватикан" очень возвращает быстро вместо того, чтобы искать все население мира.

плюсы:

  1. возможность создания слишком большого количества небольших разделов-слишком много каталогов.
  2. эффективно для данных малого объема для данного раздела. Но некоторые запросы, такие как group by на большом объеме данных по-прежнему занимают много времени для выполнения. например, группировка населения Китая займет много времени по сравнению с группировкой населения в Ватикане. Раздел не решает проблему отзывчивости в случае смещения данных в сторону определенного значения раздела.

Улей Bucketing:

Bucketing разлагает данные на более управляемые или равные части.

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

плюсы

  1. из-за равных объемов данных в каждом разделе, соединения на стороне карты будет быстрее.
  2. быстрый ответ на запрос, как разбиение

минусы

  1. вы можете определить количество ведер при создании таблицы, но загрузка равного объема данных должна быть выполнена вручную программистами.

разница составляет bucketing делит файлы по имени столбца, и перегородки делит файлы под определенным значением внутри таблицы

надеюсь, я определил его правильно