从Databricks ADLS装载点以字节字符串的形式读取文件

bprjcwpo  于 2022-09-21  发布在  Spark
关注(0)|答案(2)|浏览(209)

其目标是从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)]

确认文件可读性

要确认该文件是否可读,我们可以运行以下代码片段。

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

它成功地返回

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

问题所在

因为目标是能够以字节字符串的形式读取文件,所以下面的代码片段应该是成功的,然而,它不是。

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

执行以下代码段输出:

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

数据库团队在以下链接[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/文件夹中的文件,但要求直接从挂载点读取文件。

u0njafvf

u0njafvf1#

请添加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和谷歌版来说,它应该可以工作。

2wnc66cl

2wnc66cl2#

我可以通过将**S3A://和存储桶前缀替换为相应的/dBFS/mnt/**来读取该文件。
S3a://s3-bucket/lake/output/dept/2022/09/16/20220916_1643_764250.csv/dbfs/mnt/output/dept/2022/09/16/20220916_1643_764250.csv

我用了这个:

_path = _path.replace('s3a://s3-bucket/lake', '/dbfs/mnt')

希望能有所帮助。

-边缘

相关问题