Если данные дублируются при повторной загрузке, импорт не умеет отличать новое событие от уже загруженного. Это портит отчеты, суммы, аналитику, остатки и любые расчеты поверх данных.

Решение — сделать загрузку идемпотентной: повторный запуск того же файла или периода не должен менять итоговые данные, кроме ожидаемых обновлений.

Коротко: что делать

  • Определить уникальный ключ записи
  • Проверить, что происходит при повторной загрузке одного файла
  • Найти таблицы, где появляются дубли
  • Проверить стратегию 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.