Как вставить ручку куста во внутреннюю таблицу разделов? - PullRequest
0 голосов
/ 27 августа 2018

У меня есть требование вставлять потоковые записи в секционированную таблицу Hive.Структура таблицы выглядит примерно так:

CREATE TABLE store_transation (
     item_name string,
     item_count int,
     bill_number int,
) PARTITIONED BY (
   yyyy_mm_dd string
);

Я хотел бы понять, как Hive обрабатывает вставки во внутреннюю таблицу.

Все ли записи вставляются в один файл внутри yyyy_mm_dd =2018_08_31 каталог?Или куст разделяется на несколько файлов внутри раздела, если да, то когда?

Какой из них хорошо работает из следующего в случае 1 миллиона записей в день и шаблон запроса будет между диапазоном дат?

  1. Нет раздела во внутренней таблице
  2. Разделение по дате, каждая дата имеет только один файл
  3. Разделение по дате, каждая дата имеет более одного файла

1 Ответ

0 голосов
/ 27 августа 2018

Вставка будет выполнять то же самое во всех ваших случаях, потому что вставка не запрашивает ваши существующие данные (если вы не вставляете, используя выбор из себя), и обычно каждый контейнер создает свой собственный файл, если не настроено слияние файлов.

Запрос данных с использованием диапазона дат будет работать лучше, если таблица будет разбита по дате. Слишком много файлов может привести к снижению производительности, поэтому вы можете захотеть объединить файлы во время вставки. Что такое слишком много файлов? Как сотни или даже тысячи за ежедневный раздел. Наличие нескольких файлов на раздел не вызовет проблем с производительностью, вам не нужно объединять их.

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

Количество работающих конечных картографов или редукторов + параметры конфигурации будут определять количество выходных файлов. Вы можете принудительно запустить его на одном редукторе, например, добавив предложение 'order by'. В этом случае будет создан один дополнительный файл на раздел, но он будет работать медленно. Также distribute by partition key может использоваться для уменьшения количества создаваемых файлов, но это вызовет дополнительный этап редуктора и будет работать медленнее, чем задача только для карты.

Также вы можете объединить новые файлы с существующими, используя следующие настройки:

SET hive.merge.mapfiles=true;
SET hive.merge.mapredfiles=true;
SET hive.merge.size.per.task=128000000; -- (128MB)
SET hive.merge.smallfiles.avgsize=128000000; -- (128MB)

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

См. Этот ответ для более подробной информации о слиянии: https://stackoverflow.com/a/45266244/2700344

На самом деле тип таблицы, управляемой или внешней, не имеет значения в этом контексте. Вставить или выбрать будет работать так же.

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

Для файлов ORC вы можете эффективно объединять файлы с помощью этой команды: ALTER TABLE T [PARTITION partition_spec] CONCATENATE;

...