Можно ли фильтровать файлы озера данных Azure по времени последнего изменения с помощью Azure Python SDK? - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь выполнить операции в памяти с файлами, хранящимися в лазурном датаке. Я не могу найти документацию относительно использования соответствующего шаблона без использования ADL Downloader.

Для одного файла это код, который я использую

filename = '/<folder/<filename>.json'
with adlsFileSystemClient.open(filename) as f:
    for line in f:
         <file-operations>

Но как мы фильтруем на основеимя файла (соответствие строк) или на основе даты последнего изменения.

Когда я использовал U-SQL, у меня была возможность отфильтровать набор файлов на основе последнего измененного параметра.

DECLARE EXTERNAL @TodaysTime = DateTime.UtcNow.AddDays(-1);

@rawInput=
    EXTRACT jsonString string,
            uri = FILE.URI()
            ,modified_date = FILE.MODIFIED()
    FROM @in
    USING Extractors.Tsv(quoting : true);



@parsedInput=
    SELECT *
    FROM @rawInput
    WHERE modified_date > @TodaysTime;

IsСуществуют ли аналогичные параметры для фильтрации файлов, измененных в течение указанного периода, при использовании adlsFileSystemClient?

Github Проблема: https://github.com/Azure/azure-data-lake-store-python/issues/300

Любая помощь приветствуется.

1 Ответ

1 голос
/ 22 октября 2019

Примечание:

На этот вопрос недавно ответил akharit в GitHub. Я предоставляю его ответ ниже, который решает мое требование.

** В самом adls sdk нет функциональности сборки, так как нет серверного api, который будет возвращать только файлыизменено за последние 4 часа. Должно быть легко написать код, чтобы сделать это после того, как вы получите список всех записей. Поле времени модификации возвращает миллисекунды с эпохи Unix, которые вы можете преобразовать в объект даты и времени Python с помощью

from datetime import datetime, timedelta
 datetime.fromtimestamp(file['modificationTime'] / 1000)

, а затем что-то вроде

    filtered = [file['name'] for file in adl.ls('/', detail=True) if (datetime.now() - datetime.fromtimestamp(file['modificationTime']/1000)) > timedelta(hours = 4)]

Вы можете использовать walk вместо ls длярекурсивное перечисление.

**

...