我已经在Databricks中安装了一个Blob存储帐户,并且可以正常访问它,所以我知道它可以工作。
我想做的是列出给定路径中所有文件的名称。.目前,我正在使用以下方法:
list = dbutils.fs.ls('dbfs:/mnt/myName/Path/To/Files/2019/03/01')
df = spark.createDataFrame(list).select('name')
我遇到的问题是,它的运行速度特别慢。.由于该位置大约有160,000个blob(存储资源管理器显示为〜1016106592字节,即1Gb!)
这肯定不能删除所有这些数据,我需要/想要的只是文件名。
blob是存储瓶颈吗,还是我(以某种方式)可以让Databricks并行执行命令呢?
谢谢。
答案 0 :(得分:0)
根据我的经验,基于对Azure Blob存储的理解,SDK中的所有操作或Azure Blob存储上的其他操作都将转换为REST API调用。因此,您的dbutils.fs.ls
调用实际上是在服务器上调用相关的REST API List Blobs
Blob容器。
因此,我确定您的代码的性能瓶颈确实受到了传输Blob存储上Blob列表的XML
响应主体的数量大小的数据以将Blob名称提取到{{1}的影响}变量,甚至大约有16万个斑点。
同时,所有Blob名称都将包装在XML响应的许多切片中,每个切片有一个list
限制,要获取下一个切片,则取决于上一个切片的MaxResults
值。上面的原因是为什么列出blob的速度很慢,而且不能并行。
我建议提高加载Blob列表的效率的建议是预先缓存列表Blob的结果,例如生成一个Blob逐行写入Blob列表。考虑进行实时更新,您可以尝试在发生Blob创建事件时使用Azure Function with Blob Trigger将Blob名称记录添加到Append Blob。