У меня есть приложение PySpark, которому нужно читать файлы из учетной записи хранилища BLOB-объектов Azure, где файлы разбиваются на папки каждые 5 минут в следующем формате:
\Root\yyyy\mm\dd\HH\MM\files.csv
У меня есть процесс, который запускается каждый часи хочет обработать все файлы с момента последнего запуска (который может быть дольше часа, если запуск был пропущен).Я управляю верхним водяным знаком, который сообщает мне время последней обработки папки.
Внутри файла также есть поле даты и времени, которое соответствует пути даты и времени (с более подробной информацией во втором).
Примечаниечто я не могу изменить структуру папок, чтобы Sparks предпочитал метод разделения года = гггг \ месяц = мм и т. д.
Я написал эту функцию:
from datetime import datetime
def folderDateTimeRange(startDateTime, endDateTime, levels=5):
if startDateTime.year != endDateTime.year:
return '/{*}' * levels
elif startDateTime.month != endDateTime.month:
return datetime.strftime(startDateTime, '%Y') + '/{*}' * (levels - 1)
elif startDateTime.day != endDateTime.day:
return datetime.strftime(startDateTime, '%Y/%m') + '/{*}' * (levels - 2)
elif startDateTime.hour != endDateTime.hour:
return datetime.strftime(startDateTime, '%Y/%m/%d') + '/{*}' * (levels - 3)
else:
return ""
Это ограничивает количество папокчитайте в большинстве случаев.Мне все еще нужно отфильтровать, что данные читаются по тем же временам начала и окончания, которые передаются в функцию, потому что 23:00 - 01:00 следующего дня вернет {*} в части дня и часа - следовательно, я думаю, что это можетбыть более эффективным.
В худшем примере вы передаете start = 2018-12-31 22:00:00 и end = 2019-01-01 01:00:00 - это приводит к получению всех данных за все годыбыть прочитанным.
Мои знания о глобусах ограничены - но возможно ли передать диапазон вместо {*}?