从 Databrick 文件系统读取文件

Posted

技术标签:

【中文标题】从 Databrick 文件系统读取文件【英文标题】:Reading a file from Databrick filesystem 【发布时间】:2021-05-19 10:17:27 【问题描述】:

我使用以下代码从 dbfs 读取 shapefile:

geopandas.read_file("file:/databricks/folderName/fileName.shp")

很遗憾,我无权执行此操作,并且收到以下错误

DriverError: dbfs:/databricks/folderName/fileName.shp: Permission denied

知道如何授予访问权限吗?文件存在那里(我有权使用 dbutils 将文件保存在那里 - 我可以使用 spark 从那里读取文件,但我不知道如何使用 pyspark 读取文件)。

添加这些行之后:

dbutils.fs.cp("/databricks/folderName/fileName.shp", "file:/tmp/fileName.shp", recurse = True)
geopandas.read_file("/tmp/fileName.shp")

...从下面的建议我得到另一个错误。

org.apache.spark.api.python.PythonSecurityException: Path 'file:/tmp/fileName.shp' uses an untrusted filesystem 'org.apache.hadoop.fs.LocalFileSystem', but your administrator has configured Spark to only allow trusted filesystems: (com.databricks.s3a.S3AFileSystem, shaded.databricks.azurebfs.org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem, shaded.databricks.v20180920_b33d810.org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem, com.databricks.adl.AdlFileSystem, shaded.databricks.V2_1_4.com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem, shaded.databricks.org.apache.hadoop.fs.azure.NativeAzureFileSystem, shaded.databricks.org.apache.hadoop.fs.s3a.S3AFileSystem)

【问题讨论】:

运行 dbutils 命令检查文件是否真的存在 .. 例如:dbutils.fs.ls("/databricks/folderName/") 幸运的是,它确实存在,这就是我如此惊讶的原因。我可以在那里保存一个文件,但我无法读取它:( 【参考方案1】:

GeoPandas 对 DBFS 一无所知 - 它正在处理本地文件。所以你要么需要:

使用 DBFS Fuse 从 DBFS 读取文件(但有一些 limitations):
geopandas.read_file("/dbfs/databricks/folderName/fileName.shp")
或使用dbutils.fs.cp command将文件从DBFS复制到本地文件系统,并从中读取:
dbutils.fs.cp("/databricks/folderName/fileName.shp", "file:/tmp/fileName.shp", recurse = True)
geopandas.read_file("/tmp/fileName.shp")

附:但是如果文件已经复制到驱动节点,那么你只需要从名称中删除file:

更新问题后更新:

在 AAD 直通集群上可以执行的操作存在限制,因此如果您想将文件从 DBFS 复制到本地文件系统,您的管理员需要更改集群配置,如 documentation on troubleshooting 中所述。

但是/dbfs 方式也应该适用于直通集群,尽管它至少应该是 DBR 7.3 (docs)

【讨论】:

听起来不错,但现在我遇到了第一篇文章中包含的另一个问题(不受信任的连接)。你能帮我解决一下吗? 链接是什么? 我更新了这个主题的开篇文章并在那里添加了错误消息:)【参考方案2】:

好吧,答案比我想象的要容易:

geopandas.read_file("/dbfs/databricks/folderName")

(文件夹名称,因为它是一个包含所有形状文件的文件夹)

为什么会这样?简单的。在管理控制面板(“高级”选项卡)中启用在 DBFS 上检查文件的可能性,单击您需要的文件,您将获得两个可能的文件路径。一个专用于 Spark API,另一个专用于 File API(这是我需要的)。

:)

【讨论】:

以上是关于从 Databrick 文件系统读取文件的主要内容,如果未能解决你的问题,请参考以下文章

如何从文件系统中读取 Java ObjectOutputStream 生成的文件?

Spring 云服务器无法从本地文件系统读取

使用 Flutter web (chrome) 从系统目录获取文件路径以读取文件内容 例如:CSV 或文本文件

如何获取应用程序从文件系统读取/写入文件所花费的总时间?

在 iPhone 模拟器中从硬盘读取文件

ESP32通过程序从闪存文件系统(SPIFFS)读取信息