Прямой ответ
Профилирование данных — сбор характеристик набора до проектирования преобразований. Профиль отвечает на вопросы о распределении значений, полноте и уникальности, которые определяют правила обработки.
SELECT
COUNT(*) AS rows_cnt,
COUNT(DISTINCT customer_id) AS distinct_customers,
COUNT(*) FILTER (WHERE customer_id IS NULL) AS null_customers,
COUNT(*) FILTER (WHERE amount_minor <= 0) AS nonpositive_amounts,
MIN(amount_minor) AS min_amount,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY amount_minor) AS median_amount,
MAX(amount_minor) AS max_amount
FROM dwh.orders;
| Характеристика | Что показывает | Влияние на обработку |
|---|---|---|
| Доля пустых значений | Полноту поля | Необходимость обязательности либо значения по умолчанию |
| Число уникальных значений | Кардинальность | Пригодность поля как ключа |
| Диапазон и медиана | Распределение | Наличие выбросов, выбор агрегата |
| Распределение по периодам | Равномерность поступления | Размер порций при загрузке |
Медиана и среднее различаются при наличии выбросов, поэтому среднее значение суммы не отражает типичный заказ. О вычислении процентилей — в статье про процентили метрик.
Профилирование выполняется перед проектированием проверок качества, поскольку правила проверки строятся на наблюдаемом распределении; о проверках — в статье про качество данных.
Интерпретация профиля и типовые находки
Профиль сам по себе не даёт решения: значение приобретает смысл в сравнении с ожидаемым.
Поле с двумя значениями при ожидаемом множестве. Указывает на неполную загрузку либо на изменение в источнике, где часть значений перестала поступать.
Высокая доля пустых в поле, которое должно быть заполнено. Указывает на сценарий в источнике, где поле не заполняется, либо на ошибку сопоставления при загрузке.
Уникальность ниже ожидаемой. Поле, принятое за ключ, содержит дубликаты, поэтому соединение по нему даёт умножение строк.
Резкое изменение распределения по периодам. Указывает на изменение в источнике, сбой загрузки либо сезонность, которую требуется учесть.
Практическое следствие: профиль интерпретируется относительно ожидаемого распределения, поэтому перед профилированием фиксируется ожидание по каждому полю.
Отдельный аспект — стоимость профилирования большого набора. Подсчёт уникальных значений по всему объёму требует чтения всех данных, поэтому для первичной оценки используется выборка либо приближённый подсчёт.
-- Приближённая оценка кардинальности на выборке
SELECT approx_count_distinct(user_id) FROM (
SELECT user_id FROM events USING SAMPLE 10 PERCENT
);
О выполнимости аналитических запросов на локальных данных — в статье про DuckDB из Python; о различии нагрузок при чтении больших объёмов — в статье про колоночные хранилища.
Профиль также определяет размер порции при загрузке: неравномерное распределение по периодам делает фиксированный размер порции непригодным.
Стоимость профилирования и выбор объёма
Профилирование требует чтения данных, поэтому объём анализа выбирается по задаче.
Полный объём даёт точные значения доли пустых и распределения, но требует чтения всей таблицы. Применяется для определения порогов проверок качества, где точность важна.
Выборка сокращает время анализа в разы, но даёт приближённые значения. Доля пустых на выборке близка к фактической при равномерном распределении, поэтому пригодна для первичной оценки.
Приближённые оценки кардинальности выполняются без полного перебора значений и дают погрешность в несколько процентов. Пригодны для оценки пригодности поля как ключа.
Практическое следствие: первичная оценка выполняется на выборке, точные пороги проверок определяются по полному объёму.
Отдельный аспект — повторяемость. Профиль, снятый в разное время, различается при изменении данных, поэтому результаты сохраняются вместе с датой снятия.
Практика: проведение профилирования набора
1. Зафиксируйте ожидание по каждому полю. Профиль интерпретируется относительно ожидаемого распределения, а не сам по себе.
2. Оцените полноту ключевых полей. Доля пустых значений определяет, можно ли объявить поле обязательным.
3. Проверьте уникальность предполагаемого ключа. Дубликаты в ключе приводят к умножению строк при соединении.
4. Сравните медиану и среднее. Существенное расхождение указывает на выбросы, влияющие на агрегаты.
5. Посмотрите распределение по периодам. Неравномерность поступления определяет размер порций при загрузке.
6. Используйте выборку для первичной оценки. Подсчёт уникальных значений по всему объёму требует чтения всех данных.
7. Повторяйте профилирование после изменения источника. Профиль, снятый до изменения, не отражает текущее распределение.
Рекомендации:
- Различайте профиль и проверку качества. Профиль описывает набор, проверка фиксирует нарушение правила; о проверках — в статье про качество данных.
- Сохраняйте результаты профилирования. Сравнение профилей за разные периоды показывает изменение распределения.
- Не принимайте решение по среднему значению. Медиана и распределение отражают типичное значение точнее при наличии выбросов.
- Учитывайте стоимость на больших наборах. Приближённые оценки и выборка сокращают время первичного анализа.
- Интерпретируйте находки с владельцем данных. Отклонение от ожидания может быть допустимым свойством источника, а не ошибкой.
Практический сценарий: соединение дало втрое больше строк
Контекст: после соединения заказов со справочником клиентов число строк увеличилось втрое.
- Диагностика. Профиль справочника показал, что идентификатор клиента встречается в среднем трижды: справочник содержал историю изменений, а не текущее состояние. Соединение по идентификатору давало по одной строке на каждую версию.
- Причина. Поле принято за ключ без проверки уникальности. Ожидание, что справочник содержит одно состояние на клиента, не было проверено до построения преобразования.
- Действия. (а) Сняли профиль справочника: число строк, уникальных идентификаторов и распределение числа версий на идентификатор; (б) определили правило выбора актуальной версии по отметке изменения; (в) построили представление с актуальными версиями и использовали его в соединении; (г) добавили проверку уникальности в представлении как контроль правила; (д) пересчитали результат и сверили число строк с ожидаемым.
- Результат. Соединение возвращает ожидаемое число строк, а правило выбора актуальной версии зафиксировано проверкой.
Вывод: принятие поля за ключ без проверки уникальности приводит к умножению строк при соединении. Профилирование до построения преобразования выявляет расхождение между ожидаемой и фактической структурой данных.
FAQ
Чем профилирование отличается от проверки качества? Профиль описывает распределение значений в наборе, проверка фиксирует нарушение заданного правила. Профиль выполняется для формирования правил проверки.
Нужно ли профилировать весь объём данных? Для первичной оценки достаточно выборки либо приближённых оценок. Полный объём требуется для точных порогов проверок.
Почему медиана важнее среднего? Среднее смещается выбросами, поэтому не отражает типичное значение. Расхождение среднего и медианы указывает на наличие выбросов.
Как часто повторять профилирование? После изменения схемы источника и периодически для обнаружения изменения распределения. Сравнение профилей показывает смещение значений.
Источники: PostgreSQL aggregate functions, DuckDB statistics, PostgreSQL planner statistics — ссылки в шапке.