#hadoop #hive
#hadoop #улей
Вопрос:
Когда мы не должны использовать пакетирование в улье? В чем узкое место этого метода?
Ответ №1:
Я думаю, вам не нужно использовать пакетирование, если вы не можете извлечь из него выгоду. Насколько я знаю, среди основных преимуществ группирования: более эффективная выборка и объединения на стороне карты (см. Ниже). Поэтому, если ваша таблица маленькая или вам не нужна быстрая выборка и объединения на стороне карты, просто не используйте ее, потому что вам нужно помнить, что вам нужно собирать данные перед вставкой вручную или с помощью set hive.enforce.bucketing = true;
Нет узкого места, это всего лишь один из возможных макетов данных, который позволяет вам использоватьпреимущество в некоторых ситуациях.
Пример соединения на стороне карты улья (подробнее см. Здесь):
Если объединяемые таблицы группируются по столбцам объединения, а количество сегментов в одной таблице кратно количеству сегментов в другой таблице, сегменты могут быть объединены друг с другом. Если таблица A имеет 4 сегмента, а таблица B имеет 4 сегмента, следующее объединение
SELECT a.key, a.value
FROM a JOIN b ON a.key = b.key
может быть сделано только на mapper. Вместо полной выборки B для
каждого картографа A извлекаются только требуемые сегменты. Для
приведенного выше запроса сопоставитель, обрабатывающий сегмент 1 для A, получит только сегмент 1
из B. Это не поведение по умолчанию и регулируется следующим
параметром
set hive.optimize.bucketmapjoin = true
Обновление с учетом искажения данных при группировании.
Номер корзины, рассчитанный с использованием hash_function(bucketing_column) mod num_buckets
. Если ваш столбец группирования имеет тип int, то hash_int(i) == i
(подробнее см. Здесь). Итак, если у вас есть искаженные значения в этом столбце, например, одно значение появляется намного чаще, чем другие, тогда в соответствующий сегмент будет помещено гораздо больше строк, у вас будут непропорциональные сегменты, это снижает скорость запроса. В Hive есть встроенные инструменты для преодоления асимметрии данных (см. Перекошенные таблицы), но я не думаю, что вам следует использовать столбец с перекошенными данными для группирования в первую очередь.
Комментарии:
1. Спасибо за ответ. Но я ищу ситуацию в реальном времени, в которой мы не должны использовать пакетирование. Одна из ситуаций заключается в том, что у нас «искаженные» данные.
Ответ №2:
Пакетирование — это метод, с помощью которого мы распределяем данные по файлам. которые в противном случае были бы распределены неравномерно.
Когда использовать пакетирование: когда мы знаем, что запрос будет использовать столбец, такой как «customer_id», который является последовательным или равномерно распределенным.
Когда не использовать пакетирование: мы бы не стали использовать пакетирование, если знаем, что большинство вариантов использования таблицы связаны с чтением подмножества данных.
Например: хотя мы храним исторические данные, мы обрабатываем только данные за последние 2 недели, чтобы что-то определить. В этом сценарии мы бы использовали разделение по неделям.
Ответ №3:
Вы не должны предпочитать пакетирование, когда мощность поля разбиения не слишком высока. В этом случае разделение более выгодно. И группирование может быть выполнено только для одного поля, тогда как разбиение может быть выполнено для нескольких полей, с таким порядком, как (страна, город, штат).