Как выбрать ключи разделов для таблиц Apache Iceberg
У меня есть несколько ульев-складов. Данные хранятся в файлах паркета в Amazon S3. Некоторые таблицы содержат ТБ данных. В настоящее время в улье большинство таблиц разбиты на разделы по месяцу и году, которые сохраняются в основном в виде строки. Другие поля - это временные метки bigint, int, float, double, string и unix. Наша цель - перенести их на айсберг-таблицы Apache. Проблема в том, как выбрать ключи разделов.
Я уже рассчитал количество элементов каждого поля в каждой таблице:
Select COUNT(DISTINCT my_column) As my_column_count
From my_table;
Я также рассчитал процент нулевых значений для каждого поля:
SELECT 100.0 * count(*)/number_of_all_records
FROM my_db.my_table
Where my_column IS NULL;
Короче говоря, я уже знаю три вещи для каждого поля:
- Тип данных
- Мощность
- Процент нулевых значений
Зная эти три части информации, мой вопрос: как мне выбрать лучший столбец или комбинацию столбцов в качестве ключей секционирования для моих будущих таблиц айсбергов? Есть ли какое-нибудь правило большого пальца?
Сколько разделов считается оптимизированным при выборе ключей разделов? Какой тип данных лучше всего подходит при выборе ключей раздела? Какие еще факторы необходимо учитывать? Является ли ведение в таблицах айсбергов таким же, как и в улье, и как его можно использовать с помощью ключей разделов? Какие типы данных лучше всего подходят для ключей раздела? Что лучше: иметь много маленьких разделов или несколько больших? Какие-либо другие аспекты ключей разделов, которые необходимо учитывать?
1 ответ
В вашем описании отсутствует одна важная часть - запросы. Вам нужно понять, какие запросы будут выполняться на этих данных. Понимание запросов, которые будут выполняться к данным (насколько это возможно), очень важно. Например, рассмотрим простую таблицу со столбцами: Дата, Идентификатор, Имя, Возраст. Если запросы основаны на дате, он будет запрашивать данные в контексте дат,
select * from table where date > 'some-date'
то это хорошая идея разделить по дате.
Однако, если запросы связаны с возрастом
select * from table where age between 20 and 30
тогда вам следует рассмотреть разделение по возрасту или возрастным группам