Обработка государственных праздников Великобритании в Azure Data Factory и Synapse
Иногда у вас есть процессы, которые вам не нужно запускать в определенных сценариях. В прошлом году я работал с рыночными торговыми данными. Торговля на биржах происходит каждый будний день, но не в выходные или национальные праздники, поскольку они обычно закрыты.
Это создает проблему для обычных шаблонов запуска ADF, где вы можете расписание довольно сложный триггерсценарии, такие как 1-е воскресенье каждого месяца. Однако понятия национальных праздников не существует, поэтому нам нужно обработать это после триггерной точки.
Итак, давайте переформулируем проблему в контексте ADF. Нам нужно запускать наш процесс каждый день, затем мы должны проверить, является ли эта дата выходным днем в Великобритании и запустить бизнес-логику.
Правительство Великобритании приступило к строительству полезный каталог API для потребления, один из которых содержит все праздничные дни. API возвращает следующие данные json.
curl '
Схему можно разбить на две ключевые части информации:
- Применимая страна со значениями Англия и Уэльс , Шотландия & Северная Ирландия на корневом уровне.
- Массив События который содержит несколько свойств, таких как Заголовок (название праздника) и Дата
Итак, наша цель — выбрать подходящий регион для наших данных, а затем отфильтровать даты, чтобы убедиться, что наша введенная дата не соответствует ни одной из перечисленных в приведенном выше API.
Наш окончательный конвейер будет состоять из 3 действий и параметризован, чтобы его можно было повторно использовать в качестве дочернего конвейера в более широких потоках оркестровки. Код для этого воспроизводится внизу.
Сначала нам нужно настроить наш конвейер с помощью параметры и переменные.
Нам нужно настроить параметр для приема ввода даты, который может быть от родительского процесса или триггера. Мы назвали это дата
Далее нам нужна переменная с именем Банковский выходной для сохранения ответа на вопрос «Это выходной день на эту дату?»
А веб-активность который вызывает https://www.gov.uk/bank-holidays.jsonконечная точка. Он настроен так
Результат этого должен выглядеть
Активность фильтра позволяет использовать для перебора этого массива событий и поиска совпадающих элементов.
Сначала мы должны определить наши элементы. Я вручную выбрал события Англии и Уэльса но это можно легко сделать динамичным и распространяется на другие регионы по запросу. Выражение ADF для элементов:
@activity('Get Bank Holidays').output['england-and-wales']['events']
Условия, которые мы будем использовать для фильтрации этих выбранных элементов:
@contains(item().date, formatDateTime(pipeline().parameters.date,'yyyy-MM-dd'))
Проверяем, что элемент содержит параметр date. Мы переформатируем введенную дату, чтобы гарантировать отсутствие несоответствий в сравнении. например гггг-мм-дд != мм-гггг-дд
Что выводит следующую структуру:
ItemsCount — количество элементов, которые мы искали, чтобы попытаться найти совпадение.
FilteredItemsCount — количество найденных совпадений на указанную дату.
Значение — массив совпадений для указанной даты
Пример нашего кода, когда мы не находим совпадения по дате 2021-07-07.
Пример успешного сопоставления с использованием даты 2021-04-05, которая в Великобритании является пасхальным понедельником!
Вы заметите, что свойство FilteredItemsCount увеличилось, и это свойство мы будем использовать в следующем действии.
Итак, теперь мы нашли наши совпадения или нет, теперь нам нужно установить нашу переменную, чтобы ответить на вопрос! Мы будем использовать установить переменную активность. Наша логика должна быть довольно простой, делает FilteredItemCount = 1
Выражение ADF выглядит так
{.adf expression .adf} @equals(activity('Search Bank Holidays').output.FilteredItemsCount,1)
Заключение
Теперь у вас есть конвейер Фабрики данных Azure, который может рассчитать, является ли данный день выходным днем в Соединенном Королевстве или региональным выходным днем (Уэльс, Шотландия или Северная Ирландия).