数据砖列出Azure Blob存储中的所有Blob

时间:2019-03-06 23:53:40

标签: python azure azure-blob-storage azure-databricks

我已经在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并行执行命令呢?

谢谢。

1 个答案:

答案 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。