从 Databrick 文件系统读取文件

时间:2021-05-19 10:17:27

标签: python azure pyspark databricks azure-databricks

我使用以下代码从 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)

2 个答案:

答案 0 :(得分:1)

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

  • 使用 DBFS Fuse 从 DBFS 读取文件(但有一些 limitations):
geopandas.read_file("/dbfs/databricks/folderName/fileName.shp")
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)

答案 1 :(得分:0)

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

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

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

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

:)