列出位于数据湖中的文件夹中的所有文件

Posted

技术标签:

【中文标题】列出位于数据湖中的文件夹中的所有文件【英文标题】:List All Files in a Folder Sitting in a Data Lake 【发布时间】:2020-03-04 04:14:02 【问题描述】:

我正在尝试获取一个文件夹中所有文件的清单,该文件夹有几个子文件夹,所有这些子文件夹都位于数据湖中。这是我正在测试的代码。

import sys, os
import pandas as pd

mylist = []
root = "/mnt/rawdata/parent/"
path = os.path.join(root, "targetdirectory") 

for path, subdirs, files in os.walk(path):
    for name in files:
        mylist.append(os.path.join(path, name))


df = pd.DataFrame(mylist)
print(df)

我还尝试了此链接中的示例代码:

Python list directory, subdirectory, and files

我在 Azure Databricks 中工作。我愿意使用 Scala 来完成这项工作。到目前为止,没有什么对我有用。每次,我都会收到一个空的数据框。我相信这非常接近,但我一定错过了一些小东西。想法?

【问题讨论】:

不应该是os.walk(path) 而不是root 可能先检查一下这个文件夹是否真的存在于系统中。也许它不是文件夹而是文件。 os.path.exists(path)os.path.isfile(path)os.path.isdir(path) 或者系统只在需要它时才挂载它,它不知道你需要它。?或者它可能从数据库中读取它? 我尝试了你的建议。我得到了同样的东西......一个空的数据框。这太奇怪了。这段代码,或者它的一个非常相似的版本,上周运行良好。发生了一些变化,但我不确定是什么。 首先使用任何其他程序检查文件夹是否存在,是否同名以及是否有文件。也许它是空的或者它改变了名字。 【参考方案1】:

Databricks 文件系统 (DBFS) 是一种分布式文件系统,安装在 Azure Databricks 工作区中,可在 Azure Databricks 群集上使用。如果您使用本地文件 API,则必须引用 Databricks 文件系统。 Azure Databricks 使用 FUSE 装载配置每个群集节点 /dbfs,允许在群集节点上运行的进程使用本地文件 API 读取和写入底层分布式存储层(另请参阅 documentation)。

所以在路径 /dbfs: 中必须包含:

root = "/dbfs/mnt/rawdata/parent/"

这与使用 Databricks Filesystem Utility (DBUtils) 不同。文件系统实用程序访问 Databricks 文件系统,从而更轻松地将 Azure Databricks 用作文件系统:

dbutils.fs.ls("/mnt/rawdata/parent/")

对于更大的数据湖,我可以推荐Knowledge Base 中的 Scala 示例。 优点是它为所有分发的子叶子运行列表,因此也适用于更大的目录。

【讨论】:

我不明白为什么,但对我来说,在使用 scala + java.io 时,我必须包含 dbfs 前缀。使用dbutils.fs.ls时我没有。 原因可能是您没有像上面示例中所做的那样访问安装点路径中的数据。写入挂载点路径 (/mnt) 的数据存储在 DBFS 根目录之外。对于 dbfs 路径,您必须使用 dbfs:/【参考方案2】:

我得到了这个工作。

from azure.storage.blob import BlockBlobService 

blob_service = BlockBlobService(account_name='your_account_name', account_key='your_account_key')

blobs = []
marker = None
while True:
    batch = blob_service.list_blobs('rawdata', marker=marker)
    blobs.extend(batch)
    if not batch.next_marker:
        break
    marker = batch.next_marker
for blob in blobs:
    print(blob.name)

唯一的前提是你需要导入azure.storage。因此,在 Clusters 窗口中,单击“Install-New”-> PyPI > package = 'azure.storage'。最后,点击“安装”。

【讨论】:

以上是关于列出位于数据湖中的文件夹中的所有文件的主要内容,如果未能解决你的问题,请参考以下文章

列出 mdb 文件中的所有表

如何将数据框导出到数据湖中的 CSV 文件? [复制]

列出 Azure blob 存储中不同目录的 blob

Laravel 将数据从 ajax 传递到位于单独文件中的模态视图,导致模态视图无法呈现

自动完成命令行参数

git列出本地文件夹中包含的所有repos的所有活动分支