如何在Synapse Notebooks中获取指定路径Blob的上次修改日期
Synapse Notebook获取指定Blob路径下所有文件上次修改时间的实现方案
方案1:使用Azure Blob Storage Python SDK(适合全量、大数量文件场景,性能最优)
Synapse官方运行时已经预装了所需SDK,不需要额外安装包,直接用工作区托管身份鉴权即可,不需要硬编码存储密钥。
代码示例:
from azure.storage.blob import BlobServiceClient from azure.identity import DefaultAzureCredential import pandas as pd # 替换为实际存储账号名称 STORAGE_ACCOUNT = "你的存储账号名" CONTAINER_NAME = "foo" TARGET_PATH_PREFIX = "fee/fii/" # 末尾必须加斜杠,避免匹配到同名前缀的无关文件 # 初始化客户端,使用Synapse托管身份自动鉴权 blob_service_client = BlobServiceClient( account_url=f"https://{STORAGE_ACCOUNT}.blob.core.windows.net", credential=DefaultAzureCredential() ) container_client = blob_service_client.get_container_client(CONTAINER_NAME) file_modified_records = [] # 自动分页递归遍历所有匹配前缀的Blob,包含所有层级子文件夹 for blob in container_client.list_blobs(name_starts_with=TARGET_PATH_PREFIX): # 跳过分层命名空间下的空目录占位节点 if blob.size == 0 and blob.name.endswith("/"): continue file_modified_records.append({ "file_full_path": blob.name, "last_modified_time": blob.last_modified }) # 转为DataFrame直接展示或后续处理 result_df = pd.DataFrame(file_modified_records) display(result_df)
注意事项:
- 该方案同时兼容普通Blob存储和开启分层命名空间的ADLS Gen2存储
- 接口采用分页拉取元数据,即使路径下有百万级文件也不会出现内存溢出问题
- 若无法使用托管身份,可将
credential参数替换为存储账号连接字符串或访问密钥,生产环境不推荐硬编码密钥
方案2:使用PySpark内置接口(适合后续需要用Spark处理文件的场景,零额外配置)
如果后续逻辑需要用Spark处理路径下的文件,直接用Spark内置的文件读取接口就能拿到修改时间,不需要额外配置鉴权。
代码示例:
# 替换为实际路径 TARGET_FULL_PATH = "abfss://foo@你的存储账号名.dfs.core.windows.net/fee/fii/" # 读取路径下所有文件元数据,默认递归遍历所有子文件夹 spark_file_df = spark.read.format("binaryFile").load(TARGET_FULL_PATH) # 只保留需要的路径、修改时间字段,不加载实际文件内容 result_spark_df = spark_file_df.select("path", "modificationTime") display(result_spark_df)
注意事项:
- 该方案不会返回空目录节点,所有记录均为实际存储的文件
- 文件量级在十万级以上时,性能弱于SDK方案,优势是和Spark生态无缝衔接
常见踩坑点
- 遍历路径时必须给前缀末尾加斜杠,否则会匹配到同前缀的其他无关文件,比如前缀写
fee/fii会把fee/fii_backup/xxx、fee/fii_test.txt这类不属于目标路径的内容也拉取出来 - 不要不加前缀遍历整个容器,会产生不必要的接口调用,拉取效率极低
- Blob存储本身没有真实文件夹结构,所有层级都是文件名的前缀,官方没有比前缀匹配更高效的指定路径遍历方式
内容的提问来源于stack exchange,提问作者OK 400
相关产品推荐
相关产品推荐

