繁体   English   中英

可以使用 azure python ZEAE18BC41E14314DD98FA2DD9889 根据上次修改时间过滤 azure 数据湖文件吗?

[英]Can azure data lake files be filtered based on Last Modified time using azure python sdk?

我正在尝试对存储在 azure datalake 中的文件执行内存操作。 如果不使用 ADL 下载器,我无法找到有关使用匹配模式的文档。

对于单个文件,这是我使用的代码

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;

使用adlsFileSystemClient时,是否有任何类似的选项可以过滤指定时间段内修改的文件?

Github 问题: https://github.com/Azure/azure-data-lake-store-python/issues/300

任何帮助表示赞赏。

笔记:

最近, akharit在 GitHub 中回答了这个问题。 我在下面提供他的答案,可以解决我的要求。

**adls sdk 本身没有任何内置功能,因为没有服务器端 api 将仅返回在过去 4 小时内修改的文件。 在获得所有条目的列表后,编写代码应该很容易做到这一点。 修改时间字段返回自 unix 纪元以来的毫秒数,您可以将其转换为 python 日期时间 object

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 进行递归枚举。

**

根据下面的代码,您可以找到容器级别的目录和文件名以及文件属性,包括 last_modified 数据。 因此,您可以根据 last_modified 日期控制文件。

from pyspark.sql.functions import col
from azure.storage.blob import BlockBlobService
from datetime import datetime
block_blob_service = BlockBlobService(account_name='acccount_name', account_key='account-key')
container_name ='Contaniner_name'
second_conatainer_name ='Contaniner_name_second'
#block_blob_service.create_container(container_name)
generator = block_blob_service.list_blobs(container_name,prefix="Recovery/")
report_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

myfile = open('/dbfs/adlsaudit/auditfiles2', 'w')
for blob in generator:
    length = BlockBlobService.get_blob_properties(block_blob_service,container_name,blob.name).properties.content_length
    last_modified = BlockBlobService.get_blob_properties(block_blob_service,container_name,blob.name).properties.last_modified
    file_size = BlockBlobService.get_blob_properties(block_blob_service,container_name,blob.name).properties.content_length
  #  print("\t Recovery: " + blob.name,":" +str(length),":" + str(last_modified))
    line = container_name+'|'+second_conatainer_name+'|'+blob.name+'|'+ str(file_size) +'|'+str(last_modified)+'|'+str(report_time)
    myfile.write(line+'\n')
myfile.close()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM