Проверка уникальности данных с помощью GX
Уникальность данных - это фундаментальный аспект качества данных, который гарантирует, что отдельные значения будут присутствовать в наборе данных только один раз и там, где это ожидается. Ограничения уникальности часто применяются к столбцам, которые служат первичными ключами, составными ключами или другими уникальными идентификаторами. Проверка уникальности очень важна для поддержания целостности данных, поскольку она предотвращает дублирование информации и гарантирует точность анализа.
Отсутствие проверки уникальности может привести к различным проблемам с качеством данных, например:
- Дубликаты могут исказить аналитику и привести к неверным выводам. В частности, дублирование транзакций может привести к завышению выручки;
- Неуникальные идентификаторы могут стать причиной повреждения данных при слиянии или объединении наборов данных, что может привести к потере данных или несовпадению записей;
- Избыточные данные занимают слишком много места в хранилище и усложняют управление данными. Они также снижают производительность запросов, неоправданно увеличивая размер таблиц;
- Несоответствия, вызванные нарушением уникальности, подрывают доверие к данным. Аналитики и руководители организаций могут усомниться в рекомендациях, полученных на основе имеющейся информации, и не решатся действовать в соответствии с полученными данными.
Great Expectations (GX) представляет собой набор ожиданий, необходимых для проверки уникальности данных. Кодифицируя правила уникальности и регулярно проверяя данные на соответствие им, организации могут выявлять проблемы на самых ранних стадиях и гарантировать высокое качество данных необходимых для решения широкого спектра задач. В этой статье мы Вам расскажем о том, как использовать GX для проверки уникальности в рамках проверки данных.
Необходимые условия
Эта статья предполагает, что Вы уже знакомы с основными компонентами и рабочими процессами GX.
Предварительный обзор данных
|
custo mer_id |
first_ name |
last _name |
email_ address |
second ary_email |
pho ne_number |
count ry_code |
govern ment_id |
|
1 |
John |
Doe |
+1 123 456-7890 |
US |
123-45-6789 |
||
|
2 |
Jane |
Smith |
+1 409 437-3210 |
CA |
987 654 321 |
||
|
3 |
Bob |
Thatcher |
US |
235-98-4389 |
|||
|
4 |
Jon |
Doe |
+1 888 999-9999 |
US |
|||
|
5 |
J |
Doe |
US |
123-45-6789 |
|||
|
6 |
Jenny |
Williams |
CA |
298 367 456 |
|||
|
7 |
Johnathan |
Doe |
+44 333 981537 |
UK |
RC 23 94 27 B |
||
|
8 |
Liz |
Brown |
+44 1224 587623 |
UK |
|||
|
9 |
Jonathan |
Doe |
+44 333 991537 |
UK |
RC 23 94 27 C |
||
|
10 |
Elizabeth |
Brown |
+44 1224 587623 |
UK |
Поля первичного ключа, такие как customer_id, могут однозначно идентифицировать строку данных, но не всегда могут однозначно идентифицировать объект из реального мира, например, человека. В этом наборе данных некоторые отдельные клиенты представлены несколькими строками, каждая из которых имеет незначительные различия. Такое часто встречается в базах данных клиентов и представляет собой проблему для проверки и поддержания уникальности данных.
Уникальность данных особенно важна для таких полей, как customer_id, email_address и government_id. Однако из-за ошибок, допускаемых при вводе данных, многократных регистраций или миграции систем могут все равно возникать дубликаты. При объединении таких полей, как код страны (country_code) и идентификатор правительства (government_id), в идеале можно сформировать уникальный идентификатор для каждого клиента. Это будет гарантировать то, что каждый клиент регистрируется отдельно, и позволит избежать таких проблем, как фрагментированные профили клиентов или некорректные сообщения.
Ключевые ожидания уникальности
Дублирование данных может проявляться как в виде дублирования строк в наборе данных, так и в виде дублирования значений, содержащихся в одной строке. GX предоставляет ожидаемые параметры, доступные как в GX Cloud, так и в GX Core, которые проверяют уникальность данных.
Expect column values to be unique
Это ожидание проверяет, что каждое значение в столбце уникально. Это особенно полезно при проверке отсутствия дубликатов в столбце, который должен содержать только уникальные значения, например, в столбце первичного ключа.
Пример: Столбец customer_id должен содержать только уникальные значения.
gxe.ExpectColumnValuesToBeUnique(column="customer_id")
Expect compound columns to be unique
Данное ожидание проверяет, чтобы комбинация значений в нескольких столбцах была уникальна для каждой строки. Его также можно использовать для проверки уникальности набора столбцов, которые вместе образуют уникальный идентификатор, например, составной ключ.
Пример: комбинация значений country_code и government_id должна уникально идентифицировать запись о клиенте.
gxe.ExpectCompoundColumnsToBeUnique( column_list=["country_code", "government_id"], )
Expect column proportion of unique values to be between
Это ожидание проверяет, чтобы доля уникальных значений в столбце находилась между заданным минимальным и максимальным значениями. Это особенно полезно для обеспечения определенного уровня уникальности в столбце, не требующем полной уникальности.
Пример: необходимо убедиться в том, что не менее 90 % всех значений email_address клиента являются уникальными.
gxe.ExpectColumnProportionOfUniqueValuesToBeBetween(
column="email_address", min_value=0.9, max_value=1.0
)
Expect column unique value count to be between
Это ожидание проверяет, чтобы количество уникальных значений в столбце находилось между заданным минимальным и максимальным значениями. Это особенно полезно для проверки того, что количество уникальных значений точно попадает в ожидаемый диапазон, например, для проверки известного диапазона значений категории в категориальном столбце.
Пример: Убедиться в том, что столбец country_code содержит от 1 до 5 уникальных значений.
gxe.ExpectColumnUniqueValueCountToBeBetween(
column="country_code", min_value=1, max_value=5
)
Expect select column values to be unique within record
Это ожидание проверяет, чтобы для каждой строки значения в указанном наборе столбцов были уникальны. Это особенно полезно для проверки наличия дублирующихся значений столбцов в одной строке. Обратите внимание, что это ожидание допускает дублирование строк в наборе данных, если указанные столбцы имеют уникальные значения в каждой отдельной строке.
Пример: Каждая запись о клиенте должна иметь уникальные email_address и secondary_email.
gxe.ExpectSelectColumnValuesToBeUniqueWithinRecord(
column_list=["email_address", "secondary_email"],
)
Подсказки GX, касающиеся ожиданий уникальности
- Если Ваши данные допускают небольшое количество дубликатов, рассмотрите возможность использования ExpectColumnProportionOfUniqueValuesToBeBetween или ExpectColumnUniqueValueCountToBeBetween (вместо строгих ожиданий уникальности). Эти ожидания позволяют установить порог для доли или количества уникальных значений, обеспечивая большую гибкость в случаях, когда идеальная уникальность не нужна или когда допустимо небольшое количество дубликатов;
- При проверке уникальности учитывайте уровень детализации, необходимый для Вашего конкретного случая. Ожидания на уровне столбцов, такие как ExpectColumnValuesToBeUnique, обеспечивают уникальность в пределах одного столбца, а ожидания на уровне строк, такие как ExpectCompoundColumnsToBeUnique, проверяют уникальность в нескольких столбцах. Выберите подходящее ожидание в зависимости от того, нужно ли Вам проверить уникальный идентификатор, составной ключ или комбинацию полей, которые должны быть уникальными в каждой строке.
Пример: Выявление потенциально дублирующихся единиц
Контекст: поля первичного ключа могут использоваться для уникальной идентификации строк данных, но не всегда могут однозначно идентифицировать соответствующую им реальную сущность. Предотвращение дублирования записей и поддержание уникальности данных часто не может быть достигнуто только ограничениями первичного ключа, для подтверждения групп атрибутов необходимо использовать дополнительные проверки уникальности.
Например, в наборах данных о клиентах для всех записей о клиентах может быть создан идентификатор customer_id, но по разным причинам в набор данных все равно могут попасть дубликаты клиентов (реальные люди, представленные несколькими строками данных): из-за несоответствия контактной информации, предоставленной самим клиентом, ошибок при вводе данных или неудачной миграции данных.
Цель: с помощью функции «ожидание уникальности» в GX Cloud или GX Core выявить потенциальные дубликаты в наборе данных о клиентах.
GX Cloud
Используйте пользовательский интерфейс GX Cloud для того, чтобы выполнить следующие шаги:
- Создайте Postgres Data Asset для таблицы uniqueness_customers, используя следующую строку подключения:
postgresql+psycopg2://try_gx:try_gx@postgres.workshops.greatexpectations.io/gx_learn_data_quality
- Добавьте ожидание для проверки уникальности столбца customer_id, который служит первичным ключом для набора данных:
- ожидание: значение столбцов должно быть уникальным
- столбец: customer_id
- Добавьте два ожидания, которые проверяют уникальность составных ключей (которые должны представлять одну реальную сущность (клиента):
- У отдельных клиентов должен быть уникальный идентификатор, относящийся к стране.
- Ожидание: составные столбцы должны быть уникальными
- Список столбцов: country_code, government_id
- Игнорировать строку, если: любое значение отсутствует
-
У отдельных клиентов есть уникальные фамилия и номер телефона.
- Ожидание: Ожидать, что составные столбцы будут уникальными
- Список столбцов: фамилия_имя, номер_телефона
- Игнорировать строку, если: Любое значение отсутствует
- Проверьте актив данных uniqueness_customers с помощью вновь созданных ожиданий;
- Просмотрите результаты проверки. В разделе Batches & run history выберите отдельный цикл проверки (не All Runs) для того, чтобы просмотреть образец неожиданных значений.
Результат: На примере непредвиденных значений, показанных для каждого неудачного ожидания, Вы можете увидеть, что выявлены две потенциальные группы дублирующихся записей о клиентах.
- country_code: US, government_id : 123-45-6789
Этот результат позволяет предположить, что идентификаторы customer_id 1 и 5 представляют одного и того же клиента, идентифицированного по дублирующимся строкам, содержащим его уникальный идентификатор правительства США.
- last_name: Brown, government_id : +44 1224 587623
Этот результат позволяет предположить, что идентификаторы customer_id 8 и 10 представляют одного и того же клиента, идентифицируемого по дублирующимся строкам, содержащим фамилию и номер телефона.
Решение GX: GX Cloud и GX Core позволяют проверять уникальность данных разными способами: в отдельных столбцах или в составных столбцах, в записях набора данных или в полях одной записи. Результаты проверки, возвращаемые GX, можно использовать не только для контроля уникальности, но и для выявления дубликатов данных.
GX Core
Запустите следующий рабочий процесс GX Core:
import great_expectations as gx
import great_expectations.expectations as gxe
# Create a Data Context.
context = gx.get_context(mode="ephemeral")
# Connect to data and create the Data Source, Data Asset, Batch Definition, and Batch.
CONNECTION_STRING = "postgresql+psycopg2://try_gx:try_gx@postgres.workshops.greatexpectations.io/gx_learn_data_quality"
data_source = context.data_sources.add_postgres(
"postgres database", connection_string=CONNECTION_STRING
)
data_asset = data_source.add_table_asset(
name="customers", table_name="uniqueness_customers"
)
batch_definition = data_asset.add_batch_definition_whole_table("batch definition")
batch = batch_definition.get_batch()
# Create an Expectation Suite containing uniqueness Expectations.
expectation_suite = context.suites.add(gx.ExpectationSuite(name="expectation suite"))
# Validate uniqueness of the primary key column.
expectation_suite.add_expectation(
gxe.ExpectColumnValuesToBeUnique(
column="customer_id",
)
)
# Validate composite keys that potentially represent a single entity
# (the individual customer) for uniqueness.
expectation_suite.add_expectation(
gxe.ExpectCompoundColumnsToBeUnique(column_list=["country_code", "government_id"])
)
expectation_suite.add_expectation(
gxe.ExpectCompoundColumnsToBeUnique(column_list=["last_name", "phone_number"])
)
# Validate the Batch using the uniqueness Expectation Suite.
validation_result = batch.validate(expectation_suite)
# Parse the Validation Result for potential duplicate customers.
for expectation_result in validation_result["results"]:
expectation = expectation_result["expectation_config"]["type"]
result = expectation_result["success"]
if result is False:
unexpected_sample = expectation_result["result"]["partial_unexpected_list"]
print(
f"Expectation: {expectation}, Potential duplicates found:\n{unexpected_sample}\n"
)
Результат:
Expectation: expect_compound_columns_to_be_unique, Potential duplicates found:
[{'country_code': 'US', 'government_id': '123-45-6789'}, {'country_code': 'US', 'government_id': '123-45-6789'}]
Expectation: expect_compound_columns_to_be_unique, Potential duplicates found:
[{'last_name': 'Brown', 'phone_number': '+44 1224 587623'}, {'last_name': 'Brown', 'phone_number': '+44 1224 587623'}]
Разбор объекта «результат проверки» позволяет получить доступ к выборке значений, которые сорвали проверку. Их можно использовать для выявления дублирующихся строк, основываясь на определении уникальности для каждого отдельного клиента.
- country_code: US, government_id : 123-45-6789
Этот результат подразумевает, что идентификаторы customer_id 1 и 5 представляют одного и того же клиента, идентифицированного по дублирующимся строкам, содержащим его уникальный идентификатор правительства США.
- last_name: Brown, government_id : +44 1224 587623
Данный результат предполагает, что идентификаторы customer_id 8 и 10 представляют одного и того же клиента, идентифицируемого по дублирующимся строкам, содержащим ее фамилию и номер телефона.
Решение GX: GX Cloud и GX Core позволяют проверять уникальность данных разными способами: в столбцах по отдельности либо вместе, в записях набора данных или в полях одной записи. Результаты проверки, возвращаемые GX, можно использовать не только для контроля уникальности, но и для выявления дубликатов данных.
Решение различных задач
Обнаружение дублирующихся транзакций 
Контекст: В финансовых системах дублирование транзакций может привести к ошибочному балансу счетов, недовольству клиентов и бухгалтерским неточностям. Контроль уникальности ключевых полей помогает обнаружить и предотвратить подобные проблемы.
Решение GX: для проверки того, что комбинация полей, однозначно идентифицирующих какую-либо транзакцию (например, временная метка, счет отправителя, счет получателя, сумма), уникальна во всех строках, используйте ExpectCompoundColumnsToBeUnique.
Обеспечение целостности записей о клиентах 
Контекст: В базе данных клиентов каждый клиент должен иметь свой уникальный идентификатор. Дублирование идентификаторов клиентов может привести к серьезным проблемам с целостностью данных, таким как нерелевантное объединение профилей клиентов, неотправленные сообщения или недостоверная аналитика. Если не выявить дубликаты сразу, их последующее устранение может спровоцировать огромное количество нежелательных последствий.
Решение GX: Для того, чтобы убедиться в том, что столбец ID клиента содержит только уникальные значения, используйте ExpectColumnValuesToBeUnique. В случае обнаружения дубликатов обязательно изучите и устраните их, только так Вы сможете сохранить целостность данных.
Обнаружение ошибок в строках агента пользователя 
Контекст: В веб-аналитике строки агентов пользователя предоставляют информацию о браузерах и устройствах посетителей. Любые аномалии в строках агентов пользователя, например небольшая доля уникальных значений, могут указывать на бот-трафик, исходящий из одного источника, или другие потенциальные проблемы, связанные с безопасностью.
Решение GX: Для того, чтобы проверить, что доля уникальных строк агента пользователя находится в ожидаемом диапазоне, используйте ExpectColumnProportionOfUniqueValuesToBeBetween. Если обнаруженная доля слишком мала, изучите источники и шаблоны трафика.
Наиболее распространенные ошибки, связанные с анализом уникальности
данных
- Игнорирование бизнес-контекста: изучите специфические требования, предъявляемые к уникальности для каждого набора данных. Бездумное применение типовых проверок может привести к ложным срабатываниям или пропуску проблемных мест;
- Проверка на неправильном уровне: Проверяйте уникальность на каждом уровне, будь то отдельные столбцы или комбинации столбцов, исходя из требований Вашего бизнеса;
- Неправильная обработка отсутствующих значений: Решите для себя, считать ли значения NULL из ряда вон выходящими или допустимыми (при проверке уникальности). Будьте последовательны, только так Вы сможете избежать искажения результатов;
- Игнорирование нюансов: Помните о пробелах, чувствительности к регистру и несовпадении типов, которые могут привести к ложноотрицательным результатам. Очищайте и нормализуйте данные перед каждой проверкой уникальности;
- Отсутствие регулярного мониторинга: Постоянно отслеживайте метрики уникальности для того, чтобы выявить любые изменения или аномалии. Настройте оповещения и отслеживайте количество уникальных значений с течением времени.
- Фокус исключительно на уникальности: Сочетайте проверку уникальности с проверкой других параметров качества данных, такими как их полнота, согласованность и достоверность.
Дальнейшие шаги
Контроль уникальности данных - важный метод поддержания высокого качества данных. Однако если в данные организации все же попадают дубликаты, проверка уникальности должна сопровождаться эффективной дедупликацией данных.
Уникальность – безусловно, очень важный показатель качества данных. И все же это лишь одна из граней комплексного подхода к поддержанию высоких стандартов качества данных. Эффективный мониторинг и управление качеством данных требуют проверки информации по многим параметрам качества, таким как полнота, схема, целостность, объем и распределение.




