Приветствую! Георгий Семенов, ментор потока «Инженер данных», на связи 👋
Ты — Data Engineer. Перед тобой стоит задача: ежедневно собирать из внешнего сервиса статистику по рекламным кампаниям твоих клиентов (дальше будем называть РК).
У сервиса есть два метода API:
🟠
/adv_list возвращает список всех РК и их статусы на момент запроса (aka снэпшот). На вход принимает ID клиента.🟠
/adv_stat возвращает статистику по РК за указанный день. На вход принимает ID РК и дату.Однако у клиентов много РК в статусе «неактивный», по которым не бывает статистики за день. А нам не хочется делать лишние запросы к API — есть лимиты, которые сильно замедляют процесс. Для иллюстрации: у одного клиента 150 активных РК и 1750 неактивных. Активные мы грузим за 5 минут, а все вместе — час. Поэтому хотим запрашивать статистику только по активным РК.
Так ты и делаешь — сперва грузишь список, из него берёшь только активные РК и по ним сразу статистику за день. Но есть нюанс.
Проблема №1. Если РК будет активной в течение дня, но станет неактивной, когда мы придём за данными, то мы не получим статистику по этой РК за этот день, хотя она есть.
Проблема №2. Допустим, что-то пошло не так и загрузка сломалась, а мы заметили это только через несколько дней. Естественно, мы хотим залить провалы за эти дни, чтобы статистика была полной. Но /adv_list вернёт только текущие статусы.
Благо, в твоём случае нашлось неплохое решение. Метод
/adv_list возвращает не только текущий статус, но и таймстэмп последнего изменения РК. Поэтому для загрузки статистики за пропущенные даты ты можешь отобрать РК по следующему условию:статус = "активный" или последнее изменение >= {дата_провала}Иначе тебе пришлось бы выбирать между сильным снижением скорости импорта и потенциальной частичной потерей данных.
Вывод: импорта снэпшотов стоит избегать, особенно если от них зависят другие расчёты. Снэпшоты теряют информацию о промежуточных изменениях, и на практике чаще всего занимают значительно больше места, чем логи изменений тех же объектов.
Но если у тебя нет влияния на источник, приходится работать с тем, что дают. И в таком случае заранее тщательно продумывай зависимости, чтобы не было проблем.
🤔 Если вы не до конца поняли пост, или наоборот, поняли, и хотите узнать ещё про разные виды датасетов, партицирование, бэкфиллинг и другие приколы процессов обработки данных — жду вас завтра, 22 октября, на моём бесплатном вебинаре.
P. S. Можно усложнить решение задачи, чтобы ещё сильнее уменьшить потенциальное количество запросов к
/adv_stat. Пишите свои варианты в комментариях.📊 Simulative