Код Middle CDC и инкрементальная загрузка спрашивают часто обновлено
Применить события Debezium к состоянию
Условие
Напишите apply_changes(state, events). state: словарь id -> строка (строка это словарь), ключи строки в виде строк. events: список событий в формате, похожем на Debezium: {"op": "c" | "u" | "d" | "r", "before": dict | None, "after": dict | None, "lsn": int}; у строки есть поле "id". События могут прийти не по порядку и с повторами: применяйте их в порядке lsn, событие с уже применённым или меньшим lsn для того же ключа пропускайте. Для c, u, r записывайте after в state[str(after["id"])], для d удаляйте state[str(before["id"])], если он есть. Верните итоговое состояние.
Примеры
apply_changes({}, [{"op":"c","before":null,"after":{"id":1,"city":"Казань"},"lsn":10}]) // {"1":{"id":1,"city":"Казань"}}
apply_changes({"1":{"id":1,"city":"Казань"}}, [{"op":"u","before":{"id":1,"city":"Казань"},"after":{"id":1,"city":"Москва"},"lsn":20}, {"op":"d","before":{"id":1,"city":"Москва"},"after":null,"lsn":30}]) // {}
apply_changes({}, [{"op":"d","before":{"id":1},"after":null,"lsn":30}, {"op":"c","before":null,"after":{"id":1},"lsn":10}]) // {}
Как подойти
Подсказки: 2
- Отсортируйте события по
lsn. - Храните последний применённый
lsnпо ключу.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Ещё по теме «CDC и инкрементальная загрузка»
- Удаления в аналитике
- Событие Debezium
- Transactional outbox
- Удаления при инкременте по updated_at
- Спроектируйте репликацию данных сервисов в хранилище через CDC
- Полная или инкрементальная загрузка
- Преимущества log-based CDC
- Запуск CDC из PostgreSQL