【问题标题】:Read a file as byte string from a Databricks ADLS mount point从 Databricks ADLS 挂载点读取文件作为字节字符串
【发布时间】:2021-12-28 11:05:51
【问题描述】:

目标是从 ADLS 挂载点将文件作为 字节字符串 在 Databricks 中读取。

确认 ADLS 挂载点

首先,使用dbutils.fs.mounts()确认有以下内容:

... MountInfo(mountPoint='/mnt/ftd', source='abfss://ftd@omitted.dfs.core.windows.net/', encryptionType=''), ...

确认文件存在

该文件名为TruthTable.csv,已使用以下命令确认其下落:

dbutils.fs.ls('/mnt/ftd/TruthTable.csv')

返回:

[FileInfo(path='dbfs:/mnt/ftd/TruthTable.csv', name='TruthTable.csv', size=156)]

确认文件的可读性

为了确认可以读取文件,我们可以运行以下 sn-p。

filePath = '/mnt/ftd/TruthTable.csv'
spark.read.format('csv').option('header','true').load(filePath)

成功返回

DataFrame[p: string, q: string, r: string, s: string]

问题

由于目标是能够以字节串的形式读取文件,所以下面的 sn-p 应该是成功的,然而,它不是。

filePath = '/mnt/ftd/TruthTable.csv'
with open(filePath, 'rb') as fin:
  contents = fin.read()
  print(contents)

执行以下 sn-p 输出:

FileNotFoundError: [Errno 2] No such file or directory: '/mnt/ftd/TruthTable.csv'

Databricks 团队在以下链接 [https://docs.databricks.com/data/databricks-file-system.html#local-file-apis][https://docs.databricks. com/data/databricks-file-system.html#local-file-apis] 仅适用于在 /tmp/ 文件夹中找到的文件,但是,要求是直接从挂载点读取文件。

【问题讨论】:

    标签: python pyspark databricks azure-databricks


    【解决方案1】:

    请添加 dbfs 前缀:

    filePath = '/dbfs/mnt/ftd/TruthTable.csv'
    with open(filePath, 'rb') as fin:
      contents = fin.read()
      print(contents)
    

    对于本机数据块函数(如 dbutils),dbfs 用作默认位置。 当您直接访问文件系统时,您需要添加默认挂载目录 /dbfs。或者,您可以使用“dbfs:/mnt/ftd/TruthTable.csv”。如果您使用免费的社区版,它根本无法工作,因为无法访问底层文件系统。对于 Azure、Aws 和 Google 版本,它应该可以工作。

    【讨论】:

    • 我其实已经尝试过这种方法,但是,有一个例外。例如,dbutils.fs.ls('/mnt/ftd/MyServerType/MyServerName/LandingExperiments/dbo.SampleTsv/SampleTsv.txt') 确认文件的存在,但 filePath = '/dbfs/mnt/ftd/MyServerType/MyServerName/LandingExperiments/dbo.SampleTsv/SampleTsv.txt' 会导致 FileNotFoundError。当路径中涉及多个嵌套文件夹时,安装点似乎无法轻松访问内容。此外,我还可以访问付费版 Azure Databricks。
    • 请尝试使用魔法命令逐步验证文件夹结构,同时使用 shell %sh ls / ls /dbfs/mnt/ftd/MyServerType/MyServerName/LandingExperiments/dbo.SampleTsv/ 等。
    • 执行多个ls命令后,逐个文件夹遍历,从root开始,Python打开文件代码执行成功。但是,这是我之前发现的一种方法。我在执行打开文件 Python 代码之前在我的代码中发现了一个错误,它模拟了这种基于 ls 的遍历。我将继续测试这种方法的可靠性,因为这似乎不是 100% 可靠的。
    猜你喜欢
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2020-03-18
    • 2013-02-28
    • 2017-09-06
    相关资源
    最近更新 更多