Learning Platform
Глоссарий Troubleshooting
Урок 05.06 · 25 мин
Продвинутый
Great ExpectationsExpectation SuiteData Validation

Валидация данных с Great Expectations

Введение

dbt tests (урок 5) отлично работают внутри dbt-pipeline. Но не все данные проходят через dbt: CSV-файлы от внешних лабораторий, API-данные, raw data в S3. Great Expectations (фреймворк) — open-source Python-фреймворк для валидации данных любого формата и из любого источника. В этом уроке мы разберём архитектуру GE и научимся создавать Expectation Suites.

Концепция: Expectations

В Great Expectations правило качества называется Expectation — декларативное утверждение о данных:

# "Я ожидаю, что значения в столбце payment_id уникальны"
expect_column_values_to_be_unique(column="payment_id")

# "Я ожидаю, что currency принимает только значения RUB, USD, EUR"
expect_column_values_to_be_in_set(column="currency", value_set=["RUB", "USD", "EUR"])

Каждый Expectation — это тест, который возвращает True/False с детальным отчётом.

Архитектура Great Expectations

КомпонентНазначение
Data SourceПодключение к данным: Pandas, Spark, SQL, файлы
Expectation SuiteНабор правил для одного датасета
ValidatorПроверяет данные против Expectation Suite
CheckpointОркестрация: какие данные проверять, какими suites, куда отправить результат
Data DocsАвтоматически сгенерированная HTML-документация результатов
Data SourceПодключение к CSV, PostgreSQL, S3, Spark DataFrame
Expectation SuiteНабор правил: not_null, unique, in_set, between, custom
ValidatorПрименяет suite к данным, генерирует результаты
Data DocsHTML-отчёт с результатами валидации: pass/fail по каждому expectation

Hands-On Lab: Quality Lab

Practice these concepts with an intentionally dirty dataset and Great Expectations:

cd labs/quality && cp .env.example .env && docker compose up -d --build

Open JupyterLab at http://localhost:28888 and complete Notebooks 02 and 03: Expectation Basics + Expectation Suite — write GE expectations against dirty data, build a full suite, and run a validation checkpoint.

Note: The lab uses GE 1.x API (current). This lesson references 0.18.x patterns for context — see the lab README for API differences.

Requirements: Docker Desktop with 4+ GB RAM allocated. See labs/quality/README.md for full setup.

Проверка знанийKnowledge check
dbt tests и Great Expectations решают одну задачу -- тестирование качества данных. В чём ключевое архитектурное различие?
ОтветAnswer
dbt tests работают только с данными внутри dbt pipeline (SQL-трансформации в warehouse). Great Expectations работает с любыми данными: CSV, API, S3, Pandas DataFrames, Spark. Если все данные проходят через dbt -- достаточно dbt tests. Если есть данные вне dbt (внешние файлы, raw data) -- нужен GE. Многие команды используют оба: dbt tests для warehouse, GE для raw data validation.
Great Expectationsv0.18.x2026-03

Создание Expectation Suite

YAML-представление

Expectation Suite описывается как набор expectations:

expectation_suite:
  name: payments_quality_suite
  dataset: payments
  expectations:
    - type: expect_table_columns_to_match_set
      columns:
        - payment_id
        - order_id
        - amount
        - currency
        - payment_date
        - settlement_date
        - status
        - method

    - type: expect_column_values_to_be_unique
      column: payment_id

    - type: expect_column_values_to_not_be_null
      columns:
        - payment_id
        - order_id
        - amount
        - currency
        - payment_date
        - status

    - type: expect_column_values_to_be_in_set
      column: currency
      value_set: [RUB, USD, EUR]

    - type: expect_column_values_to_be_in_set
      column: status
      value_set: [pending, completed, failed, refunded]

    - type: expect_column_values_to_be_between
      column: amount
      min_value: 0.01
      max_value: 10000000

    - type: expect_column_pair_values_a_to_be_less_than_or_equal_to_b
      column_a: payment_date
      column_b: settlement_date

Python API

import great_expectations as gx

context = gx.get_context()

# Подключение к данным
datasource = context.sources.add_pandas("payments_source")
data_asset = datasource.add_csv_asset("payments", filepath="data/payments.csv")

# Создание suite
suite = context.add_expectation_suite("payments_quality_suite")

# Добавление expectations
validator = context.get_validator(
    batch_request=data_asset.build_batch_request(),
    expectation_suite_name="payments_quality_suite"
)

validator.expect_column_values_to_be_unique("payment_id")
validator.expect_column_values_to_not_be_null("payment_id")
validator.expect_column_values_to_be_in_set("currency", ["RUB", "USD", "EUR"])
validator.expect_column_values_to_be_between("amount", min_value=0.01, max_value=10000000)

# Сохранение suite
validator.save_expectation_suite()

Checkpoint Execution

# Создание checkpoint
checkpoint = context.add_or_update_checkpoint(
    name="payments_checkpoint",
    validations=[{
        "batch_request": data_asset.build_batch_request(),
        "expectation_suite_name": "payments_quality_suite"
    }]
)

# Запуск валидации
result = checkpoint.run()
print(f"Success: {result.success}")

Data Docs

GE автоматически генерирует HTML-документацию:

context.build_data_docs()
context.open_data_docs()

Data Docs показывают:

  • Список expectations с результатами (pass/fail)
  • Статистику: % passed, observed values distribution
  • Историю запусков для отслеживания деградации

GE vs dbt tests: когда что использовать

Критерийdbt testsGreat Expectations
ДанныеТолько в dbt pipeline (warehouse)Любые: CSV, API, S3, DB, Spark
ЯзыкYAML + SQLPython + YAML
ОтчётностьCLI output, dbt CloudData Docs (HTML), Slack, email
ПрофилированиеНет (через dbt_profiler)Встроенное data profiling
Оркестрацияdbt test в pipelineCheckpoints, интеграция с Airflow
Кривая обученияНизкая (YAML)Средняя (Python)

Сценарий: БиоГенезис

Сценарий: BioGenesis Lab (БиоГенезис Лаб)

БиоГенезис получает результаты клинических анализов от внешних лабораторий в CSV-файлах по email. Данные загружаются в PostgreSQL без валидации. Проблемы:

  • Формат CSV различается между лабораториями (разные названия столбцов)
  • Единицы измерения: одна лаборатория отправляет мг/дл, другая — ммоль/л
  • Пропущенные значения не обозначены как NULL: используются пустые строки, “N/A”, ”-”

Great Expectations решает эти проблемы до загрузки в PostgreSQL:

expectations:
  - type: expect_table_columns_to_match_set
    columns: [patient_id, test_name, result_value, unit, lab_id, test_date]
  - type: expect_column_values_to_be_in_set
    column: unit
    value_set: [mg/dL, mmol/L, g/L, U/L]
  - type: expect_column_values_to_not_be_null
    columns: [patient_id, test_name, result_value]
BioGenesis: GE Validation Results
85Schema Match
92Null Coverage
78Value Range
70Unit Consistency
Средний балл:81/ 100
Проверка знанийKnowledge check
БиоГенезис получает CSV-файл с результатами анализов. 15% файлов имеют нестандартные столбцы. Какой GE expectation обнаружит это при загрузке?
ОтветAnswer
expect_table_columns_to_match_set -- проверяет, что набор столбцов в файле соответствует ожидаемому. При несовпадении (лишние или отсутствующие столбцы) expectation возвращает failure с детализацией: какие столбцы отсутствуют, какие лишние. Это первая линия защиты от нестандартных форматов.

Итоги

  • Great Expectations — Python-фреймворк для валидации любых данных (CSV, API, S3, DB)
  • Expectation — декларативное правило качества: expect_column_values_to_be_unique, expect_column_values_to_be_in_set
  • Expectation Suite — набор правил для одного датасета
  • Checkpoint — оркестрация: запуск suite на данных с генерацией отчёта
  • Data Docs — автоматическая HTML-документация результатов
  • GE и dbt tests комплементарны: dbt для warehouse, GE для raw data
Great Expectations + Spark — distributed validation pytest parametrize — основа для GE-style data tests

В следующем уроке мы завершим модуль темой Data Observability — непрерывного мониторинга здоровья data pipeline, включая freshness SLA, incident response и интеграцию с CDC-системами.

Проверьте понимание

Результат: 0 из 0
Прикладной
Вопрос 1 из 5. BioGenesis получает CSV-файлы от внешних лабораторий с нестандартными названиями столбцов. Какой Great Expectations expectation обнаружит несоответствие схемы при загрузке?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 8