Как выбрать ключи разделов для таблиц 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. Тип данных
  2. Мощность
  3. Процент нулевых значений

Зная эти три части информации, мой вопрос: как мне выбрать лучший столбец или комбинацию столбцов в качестве ключей секционирования для моих будущих таблиц айсбергов? Есть ли какое-нибудь правило большого пальца?

Сколько разделов считается оптимизированным при выборе ключей разделов? Какой тип данных лучше всего подходит при выборе ключей раздела? Какие еще факторы необходимо учитывать? Является ли ведение в таблицах айсбергов таким же, как и в улье, и как его можно использовать с помощью ключей разделов? Какие типы данных лучше всего подходят для ключей раздела? Что лучше: иметь много маленьких разделов или несколько больших? Какие-либо другие аспекты ключей разделов, которые необходимо учитывать?

1 ответ

В вашем описании отсутствует одна важная часть - запросы. Вам нужно понять, какие запросы будут выполняться на этих данных. Понимание запросов, которые будут выполняться к данным (насколько это возможно), очень важно. Например, рассмотрим простую таблицу со столбцами: Дата, Идентификатор, Имя, Возраст. Если запросы основаны на дате, он будет запрашивать данные в контексте дат,

      select * from table where date > 'some-date'

то это хорошая идея разделить по дате.

Однако, если запросы связаны с возрастом

       select * from table where age between 20 and 30

тогда вам следует рассмотреть разделение по возрасту или возрастным группам

Другие вопросы по тегам