You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Databricks中使用dbutils.fs.ls时能否下推文件名过滤?

解决Azure Blob大规模文件列表获取失败并实现前缀过滤的方案

问题根源

dbutils.fs.ls会将容器内所有文件的元数据拉取到Driver节点内存中,当文件量达到千万级时,Driver(Standard_D4ds_v5)的内存无法承载,直接导致驱动崩溃重启。要解决这个问题,必须在存储服务端完成文件名过滤,避免全量元数据传输。

可行解决方案

方案1:使用Azure Blob Storage SDK直接实现服务端过滤

通过Azure官方的Storage SDK直接调用Blob存储的服务端过滤接口,仅返回以"Energy"开头的文件,全程不需要拉取全量元数据。

步骤:

  1. 安装依赖库(如果集群未预装):
%pip install azure-storage-blob
  1. 编写Python代码实现前缀过滤:
from azure.storage.blob import BlobServiceClient

# 替换为你的存储账户连接字符串
conn_str = "DefaultEndpointsProtocol=https;AccountName=<your-account>;AccountKey=<your-key>;EndpointSuffix=core.windows.net"
container_name = "<your-container>"

blob_service_client = BlobServiceClient.from_connection_string(conn_str)
container_client = blob_service_client.get_container_client(container_name)

# 服务端过滤:仅列出前缀为"Energy"的Blob,自动分页处理
for blob in container_client.list_blobs(name_starts_with="Energy"):
    print(f"文件路径: {blob.name}")

方案2:使用Spark DataFrame API实现下推过滤

利用Spark的pathGlobFilter参数,让过滤逻辑下推到Azure Blob存储层,Spark会并行获取符合条件的文件元数据,避免Driver单点压力。

代码示例:

# 替换为你的Blob存储路径(推荐使用ABFS协议)
storage_path = "abfss://<container>@<account>.dfs.core.windows.net/"

# 读取符合前缀的文件,自动下推过滤
df = spark.read.format("text") \
    .option("pathGlobFilter", "Energy*") \
    .load(storage_path)

# 获取所有符合条件的文件路径
file_paths = df.select("input_file_name").distinct().collect()
for path in file_paths:
    print(path[0])

注意事项

  • 使用ABFS协议(abfss://)而非旧的WASB协议,ABFS对Azure Blob的元数据操作支持更高效,下推优化更完善。
  • 如果过滤后文件数量仍较多,建议使用分页或分批处理逻辑,避免一次性加载过多数据到内存。

内容的提问来源于stack exchange,提问作者Mohammad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:02:13