Проверка схемы данных с помощью GX
Схема данных - это структурный план набора данных, включающий в себя такие элементы, как имена столбцов, типы данных и общая организация информации. При работе с данными обеспечение их соответствия заданной схеме является важнейшим аспектом управления качеством данных. Этот процесс, более известный как проверка схемы, является одним из наиболее приоритетных вариантов использования платформ для поддержания высокого качества данных.
Проверка схемы данных имеет решающее значение для поддержания надежности данных и удобства их использования в последующих задачах. Этот процесс включает в себя проверку соответствия структуры набора данных установленным правилам, например, проверку имен столбцов, типов данных и наличия обязательных полей. Любые изменения схемы, как запланированные, так и неожиданные, могут повлиять на целостность данных и производительность систем, зависящих от данных.
Great Expectations (GX) предоставляет ожидания, ориентированные на схему, которые позволяют определить и обеспечить структурную целостность наборов данных. Вы можете генерировать некоторые из этих ожиданий автоматически (особенно, при добавлении нового актива данных в GX Cloud). Эти инструменты позволяют организовать надежную проверку схем в пайплайнах, помогая выявлять и устранять проблемы, связанные со схемами, до того, как они распространятся по всей экосистеме данных. Из этой статьи Вы узнаете о том, как использовать эти ожидания для эффективной проверки схемы в рабочих процессах, связанных с данными.
Необходимые условия
Эта статья предполагает владение базовыми компонентами и рабочими процессами GX.
Предварительный обзор данных
Ниже приведен образец набора данных, на который ссылаются примеры и пояснения, описанные в этой статье:
|
type |
sender_acc ount_number |
recipien t_fullname |
transfe r_amount |
transf er_date |
|---|---|---|---|---|
|
domestic |
244084670977 |
Jaxson Duke |
9143.40 |
2024-05-01 01:12 |
|
domestic |
954005011218 |
Nelson O’Connell |
3285.21 |
2024-05-01 05:08 |
Этот набор данных отражает финансовые переводы, зарегистрированные банковскими учреждениями. Его поля включают в себя тип счета, счет отправителя, имя отправителя, сумму и дату перевода.
Ключевые ожидания касательно схемы
У GX есть коллекция ожиданий для проверки схем, каждую из которых можно добавить непосредственно из пользовательского интерфейса GX Cloud или с помощью библиотеки GX Core Python. Некоторые из них могут генерироваться при добавлении нового актива данных с помощью GX Cloud автоматически.
Ожидания схемы обеспечивают основные решения по проведению проверки данных.
Ожидания на уровне столбца
Ожидания схемы на уровне столбцов гарантируют, что отдельные столбцы в наборе данных полностью соответствуют определенным критериям. Эти ожидания предназначены для проверки самых различных аспектов, таких как тип данных и допустимые диапазоны значений в столбцах.
Expect Column Values To Be Of Type
Подтверждает, что значения в столбце относятся к определенному типу данных. Это полезно для случаев, требующих строгого соблюдения типов данных.
Пример: Работа с данными, передаваемыми в форматах, не содержащих схем (например, CSV), где при появлении новых значений может произойти явное изменение типа данных.
gxe.ExpectColumnValuesToBeOfType(column="transfer_amount", type_="DOUBLE_PRECISION")
Expect Column Values To Be In Type List
Подтверждает, что значения в указанном столбце находятся строго в пределах указанного списка типов. Это ожидание полезно для столбцов с различными допустимыми типами, такими как поля смешанного типа, которые достаточно часто встречаются в старых базах данных.
Пример: Подходит для наборов данных, «переходящих» из старых систем, где согласованность типов может не соблюдаться, что способствует плавной миграции и проверке данных.
gxe.ExpectColumnValuesToBeInTypeList(column="type", type_list=["INTEGER", "STRING"])
Подсказка GX касательно ожиданий на уровне столбцов
Объедините ExpectColumnValuesToBeInTypeList с протоколированием для того, чтобы отслеживать, какие типы встречаются чаще всего ( в конечном итоге это поможет Вам при стандартизации).
Ожидания на уровне таблиц
Ожидания схемы на уровне таблицы сфокусированы на общей структуре набора данных. Эти ожидания направлены на обеспечение соответствия набора данных предопределенным ограничениям схемы, таким как наличие необходимых столбцов, количество и порядок столбцов.
Expect Column To Exist
Обеспечивает наличие указанного столбца в наборе данных. Это ожидание является основополагающим при обзоре схемы, проверяя, включены ли в нее критически важные столбцы или нет.
Пример: Идеально подходит для ввода данных или интеграции сразу нескольких источников данных для того, чтобы убедиться в наличии необходимых полей (прежде чем приступать к последующей обработке).
gxe.ExpectColumnToExist(column="sender_account_number")
Expect Table Column Count To Equal
Гарантирует точное количество столбцов в наборе данных. Это ожидание предназначено для наборов данных с фиксированной структурой схемы, оно обеспечивает надежную защиту от непредвиденных изменений.
Пример: идеально для составления отчетности, где схема строго предопределена, и любое отклонение может привести к нарушению предъявляемых требований.
gxe.ExpectTableColumnCountToEqual(value=5)
Expect Table Columns To Match Ordered List
Проверяет порядок столбцов. Это особенно важно в случае, когда пайплайны зависят от определенного порядка столбцов, обеспечивая тем самым согласованность и надежность набора данных.
Пример: Особенно актуально при решение таких задач, как изменение порядка вычисления количества столбцов при сериализации.
gxe.ExpectTableColumnsToMatchOrderedList(
column_list=[
"sender_account_number",
"recipient_account_number",
"transfer_amount",
"transfer_date",
]
)
Expect Table Columns To Match Set
Проверяет набор данных на предмет содержания определенных столбцов без учета их порядка. Данное ожидание гарантирует гибкость в тех случаях, когда наличие столбцов более важно, чем их порядок.
Пример: применимо для наборов данных, которые могут подвергнуться переупорядочиванию в процессе предварительной обработки.
gxe.ExpectTableColumnsToMatchSet(
column_set=[
"sender_account_number",
"recipient_account_number",
"transfer_amount",
"transfer_date",
],
exact_match=False,
)
Автоматизация данного правила
Когда Вы создаете новый актив данных с помощью GX Cloud, Вы можете выбрать автоматическую генерацию данного ожидания для того, чтобы проверить, что столбцы не отклоняются от первоначального набора (с течением времени).
Expect Table Column Count To Be Between
Гарантирует, что количество столбцов находится в заданном диапазоне, обеспечивая гибкость для наборов данных, которые могут расширяться или сжиматься в границах, известных заранее.
Пример: полезно для динамических наборов данных, в которые со временем могут быть добавлены дополнительные столбцы (при этом общая структура остается ограниченной в предсказуемом диапазоне).
gxe.ExpectTableColumnCountToBeBetween(min_value=6, max_value=8)
Подсказки GX для ожиданий на уровне таблиц:
- Внедрите ExpectColumnToExist уже на самых ранних этапах пайплайна для того, чтобы как можно быстрее обнаружить отсутствующие столбцы и свести к минимуму количество ошибок и возможных переделок на последующих этапах;
- Периодически пересматривайте и обновляйте ExpectTableColumnCountToEqual вместе с любыми изменениями схемы, особенно при появлении новых нормативных требований;
- Используйте ExpectTableColumnsToMatchOrderedList вместо ExpectTableColumnsToMatchSet в случае, когда порядок столбцов имеет большое значение (например, в сценариях, напрямую ссылающихся на позиции столбцов).
- При интеграции наборов данных из разных источников, где порядок столбцов может отличаться, но важна согласованность имеющихся данных, выбирайте ExpectTableColumnsToMatchSet;
- Регулярно пересматривайте допустимый диапазон в ExpectTableColumnCountToBeBetween по мере изменения набора данных, обеспечивая его соответствие требованиям Вашего бизнеса и предвосхищая возможное расширение в будущем.
Примеры
GX Cloud предоставляет визуальный интерфейс для создания и запуска рабочих процессов проверки схем. Рабочий процесс GX Cloud для проверки схем данных заключается в создании активов данных с автоматически сгенерированными ожиданиями, ручном определении дополнительных ожиданий, запуске проверок и просмотре их результатов.
GX Core можно использовать для дополнения и расширения возможностей GX Cloud для того, чтобы реализовать пользовательские рабочие процессы проверки. В примерах, приведенных в этой статье, показаны случаи использования GX Core именно для валидации схемы.
Согласованность схемы с течением времени
Контекст: Изменения в данных могут иметь разрушительные последствия для последующих этапов, если не управлять ими правильно и неявно. Потребители данных должны быть уверены в том, что изменения в источниках данных не нарушат дальнейший процесс обработки данных. Проактивный мониторинг изменения схемы с течением времени позволяет пользователям данных заблаговременно выявлять любые изменения, которые могут внести серьезные изменения, влияющие на использование данных в дальнейшем.
Цель: регулярно проверять схему таблицы на предмет соответствия определенному набору ожиданий схемы и использовать результаты контрольных точек, а также историю проверок для того, чтобы определить, когда именно в таблицу были внесены нежелательные изменения.
import pandas as pd
import great_expectations as gx
import great_expectations.expectations as gxe
# Create Data Context.
context = gx.get_context()
# Create Data Source and Data Asset.
# CONNECTION_STRING contains the connection string for the Postgres database.
datasource = context.data_sources.add_postgres(
"postgres database", connection_string=CONNECTION_STRING
)
data_asset = datasource.add_table_asset(name="data asset", table_name="transfers")
# Create Expectation Suite and add Expectations.
suite = context.suites.add(gx.ExpectationSuite(name="schema expectations"))
suite.add_expectation(
gxe.ExpectTableColumnsToMatchSet(
column_set=[
"type",
"sender_account_number",
"recipient_fullname",
"transfer_amount",
"transfer_date",
],
exact_match=False,
)
)
suite.add_expectation(gxe.ExpectTableColumnCountToEqual(value=5))
# Create Batch Definition.
batch_definition = data_asset.add_batch_definition_whole_table("batch definition")
batch = batch_definition.get_batch()
# Validate Batch.
validation_definition = context.validation_definitions.add(
gx.ValidationDefinition(
name="validation definition",
data=batch_definition,
suite=suite,
)
)
# Define Checkpoint, run it, and capture result.
checkpoint = context.checkpoints.add(
gx.Checkpoint(name="checkpoint", validation_definitions=[validation_definition])
)
checkpoint_result_1 = checkpoint.run()
# Add a column to alter the table schema.
# update_table_schema() updates the underlying transfers table.
add_column_to_transfers_table()
# Rerun the Checkpoint and capture result.
checkpoint_result_2 = checkpoint.run()
# Format results.
results = []
for checkpoint_result in [checkpoint_result_1, checkpoint_result_2]:
run_result = checkpoint_result.run_results[
list(checkpoint_result.run_results.keys())[0]
]
results.append(
{
"timestamp": run_result["meta"]["run_id"].run_time.strftime(
"%Y-%m-%d %H:%M:%S"
),
"success": run_result["success"],
"evaluated_expectations": run_result["statistics"][
"evaluated_expectations"
],
"successful_expectations": run_result["statistics"][
"successful_expectations"
],
"unsuccessful_expectations": run_result["statistics"][
"unsuccessful_expectations"
],
}
)
pd.DataFrame(results)
Результат:
|
timestamp |
success |
evaluat ed expectations |
successf ul expectations |
unsuccessf ul expectations |
|---|---|---|---|---|
|
timestamp of first Validation |
True |
2 |
2 |
0 |
|
timestamp of second Validation |
False |
2 |
1 |
1 |
Инсайт: последующий запуск контрольной точки после изменения схемы таблицы показывает, когда именно было обнаружено изменение схемы и на что оно повлияло. Доступ к результатам контрольных точек можно получить с помощью GX Core, а историю результатов проверки можно просмотреть в пользовательском интерфейсе GX Cloud.
Строгая и облегченная проверка схемы
Контекст: требования к именам, типам и порядку столбцов зависят от контекста. Например, когда код приложения ссылается на столбцы по порядковому номеру, а не по имени, важно сохранять определенное упорядочивание столбцов. В других случаях может быть достаточно проверки только лишь наличия столбцов в наборе данных. Использование различных наборов ожиданий для обеспечения соблюдения всех этих аспектов может сохранить согласованность схемы.
Цель: проверить один и тот же набор данных с помощью двух разных наборов ожиданий для того, чтобы продемонстрировать разницу в подходах, подразумевающих строгую проверку и облегченную проверку.
import great_expectations as gx
import great_expectations.expectations as gxe
context = gx.get_context()
# Create Data Source, Data Asset, and Batch Definition.
# CONNECTION_STRING contains the connection string for the Postgres database.
datasource = context.data_sources.add_postgres(
"postgres database", connection_string=CONNECTION_STRING
)
data_asset = datasource.add_table_asset(name="data asset", table_name="transfers")
batch_definition = data_asset.add_batch_definition_whole_table("batch definition")
batch = batch_definition.get_batch()
# Create Expectation Suite with strict type and column Expectations. Validate data.
strict_suite = context.suites.add(gx.ExpectationSuite(name="strict checks"))
strict_suite.add_expectation(
gxe.ExpectTableColumnsToMatchOrderedList(
column_list=[
"type",
"sender_account_number",
"recipient_fullname",
"transfer_amount",
"transfer_date",
]
)
)
strict_suite.add_expectation(
gxe.ExpectColumnValuesToBeOfType(column="transfer_amount", type_="DOUBLE PRECISION")
)
strict_results = batch.validate(strict_suite)
# Create Expectation Suite with relaxed type and column Expectations. Validate data.
relaxed_suite = context.suites.add(gx.ExpectationSuite(name="relaxed checks"))
relaxed_suite.add_expectation(
gxe.ExpectTableColumnsToMatchSet(
column_set=[
"type",
"sender_account_number",
"transfer_amount",
"transfer_date",
],
exact_match=False,
)
)
relaxed_suite.add_expectation(
gxe.ExpectColumnValuesToBeInTypeList(
column="transfer_amount", type_list=["DOUBLE PRECISION", "STRING"]
)
)
relaxed_results = batch.validate(relaxed_suite)
print(f"Strict validation passes: {strict_results['success']}")
print(f"Relaxed validation passes: {relaxed_results['success']}")
Результат:
Strict validation passes: True Relaxed validation passes: True
Инсайт: обе проверки пройдены. Строгий набор ожиданий гарантирует, что столбцы появятся в указанном порядке и будут иметь требуемый тип данных, что очень важно в случаях, когда порядок важен для логики обработки данных. Облегченный набор ожиданий позволяет гибко изменять порядок столбцов и тип данных, гарантируя при этом наличие всех требуемых столбцов.
Наиболее распространенные ошибки, допускаемые в процессе проверки схем
-
Несоответствующие типы данных: несоответствие типов данных возникает в случае, когда данные поступают из разных источников или когда определения схем обновляются без полной проверки. Подобные несоответствия могут приводить к ошибкам в обработке информации, что делает результаты анализа ненадежными. В этом случае Вам помоет регулярный мониторинг точек ввода данных и строгое соблюдение согласованности типов с помощью системы проверки данных (смотрите
ExpectColumnValuesToBeOfTypeиExpectColumnValuesToBeInTypeList); -
Развитие схемы: Изменение требований бизнеса часто приводит к необходимости изменения схем данных, что при ненадлежащем управлении может привести к серьезным сбоям в работе системы. Изменения схем могут нарушать пайплайны и приводить к проблемам совместимости данных. Внедрение структурированного процесса версионирования схем и поддержания обратной совместимости поможет сделать эти изменения менее критическими. Периодически пересматривайте и обновляйте свою схему данных (
ExpectTableColumnCountToEqualиExpectTableColumnsToMatchOrderedList). - Использование только лишь проверки схемы: Один из самых распространенных подводных камней в данном случае - это чрезмерная зависимость от проверки схемы как единственного механизма обеспечения качества данных. Хотя проверка схемы и обеспечивает структурную целостность, она все же не учитывает семантическую корректность данных. Для того, чтобы добиться действительно высокого качества данных, сочетайте проверку схемы с семантическими проверками на уровне полей, например, с проверкой диапазонов значений, шаблонов и связей между полями. Начните с реализации ожиданий на уровне столбцов и ожиданий на уровне таблиц;
-
Ведение журнала и мониторинг: Даже самая идеальная настройка проверки может дать сбой без надлежащего протоколирования и мониторинга процессов. Незафиксированные сбои в проверке схем могут незаметно распространяться по всему пайплайну, что может привести к более серьезным последствиям. Детальное протоколирование и мониторинг в режиме реального времени необходимы для создания аудиторского отчета и оперативного обнаружения и разрешения проблем, связанных с проверкой схем. Регулярно проверяйте и корректируйте свои схемы с помощью ожидания
ExpectTableColumnCountToBeBetween.
Дальнейшие шаги
Комплексная проверка схем является основой надежного пайплайна. Great Expectations позволяет определять и обеспечивать структурную целостность данных, гарантируя их надежность для проведения анализа и принятия стратегически важных решений. Последовательное внедрение практики проверки схем позволяет повысить качество данных, сократить количество ошибок на последующих этапах и сформировать в организации культуру доверия к данным.
И все же проверка схемы - это лишь один из аспектов комплексной стратегии качества данных. Для достижения высокого качества данных необходим более комплексный подход, требующий проверки по нескольким аспектам качества данных, включая их целостность, отсутствие, объем и распределение. Для эффективной работы со всеми этими аспектами мы настоятельно рекомендуем рассмотреть возможность интеграции различных ожиданий. Регулярная проверка, мониторинг и итерации являются ключом к поддержанию высоких стандартов корпоративной информации.




