Вопрос или проблема
Создание разделяемой таблицы Iceberg в dbt с использованием соединителя Athena
Надеюсь, у вас все хорошо.
Я использую dbt с AWS Athena, чтобы начать создавать свои модели, вот пример моей конфигурации из dbt.
{{ config(
materialized='incremental',
table_type="iceberg",
unique_key = ['dt', 'country'],
partition_by = ['dt', 'country'],
s3_data_naming = 'schema_table',
on_schema_change="append_new_columns",
incremental_strategy='merge'
) }}
Таблица действительно создается в AWS, и информация хранится в S3 корректно.
Однако у меня есть несколько вопросов, чтобы я мог лучше настроить свою таблицу:
- Разделы [если они созданы правильно] не указывают наименования разделов [dt и country]. См. прикрепленное изображение, там показываются символы, и я не могу понять, к какому разделу они принадлежат.
Как я могу узнать, были ли разделы правильно настроены?
вставьте описание изображения здесь
-
В Glue и Lake Formation я не вижу атрибут primary_key для dt и country. Есть ли способ настроить это в config() в dbt?
-
Как я могу указать добавлять новые разделы только за последние 2 дня [информация за последние 2 дня], удаляя при этом старые разделы, которые старше 1 месяца?
С наилучшими пожеланиями,
Я попробовал все конфигурации, включая partition_by, unique_key и properties = {‘partitioning’}.
Ответ или решение
Добрый день!
Рад помочь вам с настройкой вашей модели iceberg в dbt, использующей AWS Athena. Позвольте мне ответить на ваши вопросы по порядку.
1. Проверка корректности создания разделов
Для того чтобы убедиться, что ваши разделы (partitions) были правильно созданы, вы можете выполнить следующую команду в Athena:
SHOW PARTITIONS your_database.your_table
Если вы видите названия разделов, которые вместо значений переменных dt
и country
отображают символы, возможно, это означает, что данные в этих переменных некорректны или форматы неправильно идентифицированы. Вы также можете проверить структуру таблицы с помощью команды:
DESCRIBE your_database.your_table
Это даст вам представление о том, какие поля имеются в таблице и их типах. Убедитесь, что dt
и country
правильно указаны и существуют в ваших данных.
2. Настройка Primary Key в Glue и Lake Formation
К сожалению, в текущей реализации dbt и Glue нет нативной поддержки применения атрибута primary key на уровне Glue Catalog или Lake Formation для таблиц Iceberg. Однако вы можете использовать дополнительные механизмы контроля данных для обеспечения уникальности, такие как:
- Обработка уникальности данных на уровне ETL/ELT в ваших моделях dbt. Например, убедитесь, что данные, которые вы загружаете в таблицу, уже уникальны по
dt
иcountry
. - Если у вас есть специальные требования к ключам, вы можете рассмотреть возможность создания триггеров или автоматизированных задач, которые будут проверять уникальность данных после загрузки.
3. Настройка добавления и удаления разбиений
Для того чтобы добавлять новые разделы только за последние 2 дня и удалять старые (старше 1 месяца), необходимо немного изменить логику в вашем dbt-модели.
Вы можете сделать это следующим образом:
- Добавление новых разделов: Измените ваш
incremental
запрос таким образом, чтобы он извлекал только данные за последние 2 дня.
WITH new_data AS (
SELECT *
FROM your_source_table
WHERE dt >= CURRENT_DATE - INTERVAL '2' DAY
)
SELECT *
FROM new_data
- Удаление старых разделов: Для удаления старых данных вы можете создать отдельную задачу с использованием AWS Glue, которая будет регулярно очищать разделы, старше 1 месяца. Ниже приведен пример SQL-запроса для удаления старых разделов:
ALTER TABLE your_database.your_table DROP IF EXISTS PARTITION (dt < date_add('day', -30, current_date))
Этот запрос удалит все разбиения старше 30 дней.
Заключение
Эти шаги помогут вам оптимизировать вашу Iceberg таблицу в dbt с использованием AWS Athena. Если у вас есть дополнительные вопросы или вам нужны больше информации о каком-либо пункте, пожалуйста, не стесняйтесь спрашивать.
С наилучшими пожеланиями!