从 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 生成的文件?