如何列出另一个订阅中的另一个 Azure Data Lake gen2 存储帐户中的所有文件和子目录

Posted

技术标签:

【中文标题】如何列出另一个订阅中的另一个 Azure Data Lake gen2 存储帐户中的所有文件和子目录【英文标题】:How to list all files and subdirectories inside another Azure Data lake gen2 storage account which is in different subscription 【发布时间】:2021-11-23 13:09:18 【问题描述】:

我正在尝试从 Azure 存储帐户中不同订阅的容器中获取所有文件及其子目录,并且业务要求是使用 abfss url 。 abfss://@.dfs.core.windows.net//。我尝试为订阅导入 spark 配置,并使用以下代码返回文件列表。还是失败了。

import os
from fnmatch import fnmatch
root_list="abfss://xxxxcontainerxxxx@xxxxxstorageaccountxxxx.dfs.core.windows.net/staging/"
files_list = []
pattern = "*.*"
print(pattern)
for path, subdirs, files in os.walk(root_list):
  for name in files:
    if fnmatch(name.upper(), pattern.upper()):
      files_list.append(path+"/"+name)

这将打印“[]”空列表。

【问题讨论】:

【参考方案1】:

您可以将以下代码用于此用例。

from pyspark.sql.functions import col
from azure.storage.blob import BlockBlobService
from datetime import datetime
import os.path

account_name='accountname'
container_name ='container_name'
second_conatainer_name ='data'
account_key = 'storage-account-key'
prefix_val = second_conatainer_name+'/'

block_blob_service = BlockBlobService(account_name='%s'%(account_name), account_key='%s'%(account_key))

#block_blob_service.create_container(container_name)
generator = block_blob_service.list_blobs(container_name,prefix="%s"%(prefix_val))
report_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')


Target_file = "/target2/%s.csv" % (container_name)
print(Target_file)

Target_file = open("%s"%(Target_file), 'w')

for blob in generator:
    length = BlockBlobService.get_blob_properties(block_blob_service,container_name,blob.name)
    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
    blob_type = BlockBlobService.get_blob_properties(block_blob_service,container_name,blob.name).properties.blob_type
    creation_time = BlockBlobService.get_blob_properties(block_blob_service,container_name,blob.name).properties.blob_tier_change_time
    if file_size != 0:
       line = account_name+'|'+container_name+'|'+blob.name+'|'+ str(file_size) +'|'+str(last_modified)[:10]+'|'
       print(line)
       Target_file.write(line+'\n')

【讨论】:

以上是关于如何列出另一个订阅中的另一个 Azure Data Lake gen2 存储帐户中的所有文件和子目录的主要内容,如果未能解决你的问题,请参考以下文章

如何从同一 Azure AD 中的另一个 Web 应用程序访问 Web api?

C# Azure.Storage.Blobs SDK 如何列出和压缩容器中的所有文件并将压缩文件存储在另一个容器中

Azure Pipeline - C# 构建项目取决于另一个存储库中的另一个项目

基于 Azure 流分析 T-SQL 查询中的另一个参数动态拆分参数

AZURE - 如何将资源从租户迁移到另一个租户

列出存在于另一个模型中的所有关联模型记录,该模型存在于 rails 中的另一个命名空间中