Существует много способов решения этой проблемы. Один из менее дорогих, производительных и масштабируемых способов - использовать хранилище данных в файловой системе для определения истинно новых данных.
- По мере поступления данных в первый раз запишите его в 2 места - базу данных и в файл (скажем, в s3). Если данные уже есть в базе данных, вам нужно инициализировать локальный файл / s3 с табличными данными.
- Поскольку данные поступают во второй раз и далее, проверьте, является ли оно новым, основываясь на его присутствии на локальном файле / s3.
- Пометить дельта-данные как новые или обновленные. Экспортируйте это в базу данных как вставку или обновление.
Со временем этот файл будет становиться все больше и больше. Определите диапазон дат, после которого обновленные данные не будут поступать. Регулярно обрезайте этот файл, чтобы сохранить данные в этом диапазоне времени. Вы также можете разбить эти данные на сегменты. Вы можете использовать Deltalake, чтобы поддерживать его тоже.
Недостатком является то, что при каждом обновлении базы данных этот файл может нуждаться в обновлении на основании того, изменяются соответствующие данные или нет. Вы можете сохранить маркер в таблице базы данных для обозначения даты syn c. Индексируйте этот столбец тоже. Прочитайте измененные записи на основе этого столбца и обновите файл / deltalake.
Таким образом, ваше приложение sparl будет меньше зависеть от базы данных. Операции с базой данных не очень масштабируемы, поэтому лучше держать их подальше от критического пути