avro-path-resolver
Описание
Языки
- Python100%
Avro Path Resolver
Надежная библиотека для разрешения путей в схемах Avro, извлечения информации о типах и вычисления физических хешей схем, устойчивых к изменениям имен и миграциям между топиками.
Почему эта библиотека?
Эта библиотека родилась из реальной проблемы: data contracts в распределенных системах данных. Когда схемы эволюционируют между окружениями (dev → staging → prod) или перемещаются между топиками, традиционные хеш-функции не работают, потому что они чувствительны к:
- Именам топиков (
vsdev.topic)prod.topic - Именам полей record
- Порядку полей
- Порядку элементов в union
Физический хеш схемы решает эту проблему, вычисляя хеш только на основе структуры ваших данных, а не их именования.
Возможности
Основные возможности
- Разбор схем Avro и извлечение информации о типах
- Разрешение типов по конкретным путям в сложных схемах Avro
- Поддержка алиасов при разрешении типов массивов
- Извлечение корневых типов на основе форматов парсеров (Debezium, Confluent и др.)
- Определение типов исходных баз данных из схем Debezium (MS SQL, PostgreSQL, MongoDB)
Возможности Data Contracts
- Физическое хеширование схем: Вычисление хешей, игнорирующих изменения имен и миграции между топиками
- Проверка эквивалентности схем: Определение, имеют ли две схемы идентичные структуры данных
- Семантическая совместимость: Проверка, можно ли безопасно использовать схему из dev в prod
Поддержка мульти-диалектов
Библиотека включает определения типов для следующих диалектов:
| Диалект | Описание |
|---|---|
| Avro | Нативные типы Apache Avro |
| PostgreSQL | Типы данных PostgreSQL |
| MS SQL Server | Типы Microsoft SQL Server |
| Trino | Типы Trino (PrestoSQL) |
| Spark | Типы Apache Spark SQL |
| Iceberg | Типы Apache Iceberg |
| Java | Типы Java |
| Greenplum | Типы Greenplum |
| Universal | Универсальные определения типов |
Сравнение схем
- Сравнение двух схем и выявление различий
- Генерация структурированного вывода diff
- Поддержка анализа эволюции схем Avro
Установка
Быстрый старт
Базовое использование
Физическое хеширование схем
Сравнение схем
Работа с Debezium
Определение типа источника
Debezium сохраняет информацию о типах исходной базы данных в метаданных схемы Avro. Эта библиотека извлекает эту информацию для определения типа исходной базы данных:
| Поле | Описание | Пример |
|---|---|---|
| Оригинальный тип базы данных | , , |
| Длина типа | , |
| Масштаб типа | , |
Библиотека использует эти метаданные для:
- Определения исходной базы данных (PostgreSQL, MS SQL, MongoDB)
- Преобразования типов Debezium в нативные типы базы данных
- Включения кросс-базового перевода схем
Расширенное использование
Разрешение путей
Граф схемы
Работа с алиасами
Поддерживаемые форматы парсеров
| Формат | Описание |
|---|---|
| Формат Confluent для PostgreSQL |
| Формат Confluent для MS SQL Server |
| Формат Confluent для MongoDB |
| Базовый тип корня Debezium |
Технологический стек
Основные зависимости
| Библиотека | Версия | Назначение |
|---|---|---|
| ^2.10.6 | Валидация и сериализация Pydantic-моделей для типов данных |
| ^1.0 | Парсинг и обработка схем Avro |
| ^3.0 | Разбор SQL-типов для диалектов PostgreSQL, MS SQL, Trino, Spark, Iceberg |
| ^2.0 | Сравнение и вычисление diff между JSON-схемами |
| ^6.0 | Парсинг YAML-конфигураций и тестовых данных |
Инструменты разработки
| Библиотека | Версия | Назначение |
|---|---|---|
| ^24.10.0 | Автоматический форматировщик кода |
| ^8.3.5 | Фреймворк для unit и интеграционных тестов |
| ^4.0 | Расчет покрытия кода тестами |
| ^0.11.13 | Быстрый линтер Python (аналог flake8 + pycodestyle) |
| ^1.16.0 | Статический анализатор типов |
| ^4.26.0 | Управление виртуальными окружениями и тестирование |
Инструменты документации
| Библиотека | Версия | Назначение |
|---|---|---|
| ^8.2.3 | Система генерации документации |
| ^3.0.2 | Тема документации (Read the Docs) |
| ^2.2.0 | Автоматическая генерация документации для Pydantic-моделей |
| ^4.0.1 | Поддержка Markdown в Sphinx |
| ^0.6.8 | Генерация Markdown-документации |
Архитектурные технологии
Pydantic v2
Проект использует Pydantic v2 для создания строго типизированных моделей данных:
для структурированных данныхBaseModelдля корневых типов (List, Union, etc.)RootModelдля кастомной валидацииmodel_validatorдля кэширования вычисленийcached_property
Pyparsing
Для разбора SQL-типов используется :
- Грамматические правила определены в grammar/dialect/*/data_types.py
- Каждый диалект (PostgreSQL, MS SQL, Trino, Spark, Iceberg) имеет свои правила парсинга
- Результат парсинга преобразуется в Pydantic-модели через set_parse_action()
Fastavro
используется для:
- Парсинга схем Avro через fastavro.schema.parse_schema
- Разворачивания схем через expand_schema
- Работы с именованными схемами (
)named_schemas
Разработка
Структура проекта
avro_path_resolver/
├── __init__.py # Экспорты публичного API
├── version.py # Информация о версии
├── exceptions/ # Пользовательские исключения
│ └── exception_base.py
├── grammar/ # Грамматика и определения типов
│ ├── data_type_model.py # Базовые модели типов
│ ├── utils.py # Утилиты разрешения типов
│ └── dialect/ # Типы для конкретных диалектов
│ ├── avro/
│ ├── postgresql/
│ ├── mssql/
│ ├── trino/
│ ├── spark/
│ ├── iceberg/
│ ├── java/
│ └── greenplum/
└── utils/ # Утилитарные модули
├── avro_schema_parser/ # Основная логика разбора
├── analyze_diff/ # Анализ diff схем
├── dump_metadata/ # Выгрузка метаданных
└── json_diff/ # JSON diff
Вклад в проект
Вклад приветствуется! Пожалуйста, прочитайте наше Руководство по вкладу для подробной информации.
- Форкните репозиторий
- Создайте ветку функции (
)git checkout -b feature/amazing-feature - Закоммитьте изменения (
)git commit -m 'Add some amazing feature' - Отправьте в ветку (
)git push origin feature/amazing-feature - Откройте Pull Request
Лицензия
Этот проект лицензирован под лицензией MIT - см. файл LICENSE для подробной информации.
Благодарности
Эта библиотека изначально разрабатывалась как часть системы управления data contracts для распределенных пайплайнов данных. Алгоритм физического хеширования схем был разработан для решения реальных задач эволюции схем и миграции между окружениями.
История версий
Смотрите CHANGELOG.md для истории релизов.