Если данные дублируются при повторной загрузке, импорт не умеет отличать новое событие от уже загруженного. Это портит отчеты, суммы, аналитику, остатки и любые расчеты поверх данных.
Решение — сделать загрузку идемпотентной: повторный запуск того же файла или периода не должен менять итоговые данные, кроме ожидаемых обновлений.
Коротко: что делать
- Определить уникальный ключ записи
- Проверить, что происходит при повторной загрузке одного файла
- Найти таблицы, где появляются дубли
- Проверить стратегию insert, upsert, replace или merge
- Добавить лог импортов и контрольные суммы
Основные причины
Дубли появляются, когда система каждый раз вставляет строки как новые и не проверяет их происхождение.
- Нет уникального ключа или он выбран неправильно
- Импорт работает только через insert
- Файл загружается повторно без проверки checksum
- ClickHouse-таблица не настроена под дедупликацию
- Периоды данных пересекаются, но не заменяются корректно
Пошаговая диагностика
Нужно взять один файл или период, загрузить его дважды на тесте и посмотреть, какие строки удвоились.
- Найти естественный ключ: external_id, date, source, event_id
- Проверить количество строк до и после повторной загрузки
- Сравнить агрегаты по суммам и событиям
- Проверить engine таблицы и ORDER BY в ClickHouse
- Проверить лог импортов и идентификатор batch
Как исправить проблему
Исправление зависит от хранилища. В SQL часто нужен upsert, в ClickHouse — правильная модель таблицы, batch_id и дедупликация на запросах или merge.
- Ввести уникальный ключ или суррогатный hash записи
- Использовать upsert/replace вместо простого insert там, где это уместно
- Хранить batch_id и checksum файла
- Настроить дедупликацию в ClickHouse через ReplacingMergeTree или отдельный слой
- Добавить проверку повторной загрузки одного источника
Безопасный план решения
Сначала исправьте будущие загрузки, затем отдельно очистите старые дубли. Массовое удаление нужно делать через проверяемый скрипт и резервную копию.
Чего не стоит делать
- Не удалять дубли только по полному совпадению всех полей без понимания ключа
- Не пересчитывать отчеты до исправления импорта
- Не смешивать очистку старых данных и изменение ETL в одном непроверенном шаге
- Не игнорировать часовые пояса и периоды
Что подготовить перед исправлением
- Пример файла или источника
- Схема таблицы
- Пример дублей
- Правило, какая запись считается уникальной
FAQ
Можно ли удалить дубли одним SQL-запросом?
Иногда можно, но сначала нужно правильно определить уникальность. Иначе можно удалить реальные повторные события.
Почему в ClickHouse дубли не исчезают сразу?
Merge-процессы и движки работают по своим правилам. Нужно понимать выбранный engine и запросы чтения.
Что такое идемпотентный импорт?
Это импорт, который при повторном запуске с теми же данными не создает лишних строк и не искажает итог.
Когда стоит обратиться за помощью
Помощь нужна, если дубли влияют на финансы, склад, отчеты или большие аналитические таблицы. Ошибка может незаметно накапливаться месяцами.
Итог
Начните с уникального ключа и повторной загрузки тестового файла. Если нужно сделать импорт, ETL или ClickHouse без дублей, можно написать в Telegram @rabotator_support.