在数据块中读取 GeoJSON,没有设置挂载点

Reading GeoJSON in databricks, no mount point set

我们最近更改了从 Databricks 连接到 ADLS 的方式,这些更改删除了之前在环境中建立的挂载点。我们正在使用数据块来查找多边形中的点,如数据块博客中所述:https://databricks.com/blog/2019/12/05/processing-geospatial-data-at-scale-with-databricks.html

之前,一段代码从 ADLS 读取 GeoJSON 文件到笔记本中,然后将其投影到集群:

nights = gpd.read_file("/dbfs/mnt/X/X/GeoSpatial/Hex_Nights_400Buffer.geojson")
a_nights = sc.broadcast(nights) 

但是,所做的新更改已删除挂载点,我们现在正在使用字符串读取文件:

"wasbs://Z@Y.blob.core.windows.net/X/Personnel/*.csv"

这适用于 CSV 和 Parquet 文件,但不会加载 GeoJSON!当我们尝试这样做时,我们收到一条错误消息“找不到文件”。我们已经检查过,文件仍在 ADLS 中。

然后我们尝试将文件临时复制到“dbfs”,这是我们之前设法读取文件的唯一方法,如下:

dbutils.fs.cp("wasbs://Z@Y.blob.core.windows.net/X/GeoSpatial/Nights_new.geojson", "/dbfs/tmp/temp_nights")
nights = gpd.read_file(filename="/dbfs/tmp/temp_nights")
dbutils.fs.rm("/dbfs/tmp/temp_nights")
a_nights = sc.broadcast(nights) 

这在代码中的第一次使用时工作正常,但紧随其后的第二个 GeoJSON 运行(我们试图写入 temp_days)在 gpd.read_file 阶段失败,说找不到文件!我们已经检查了 dbutils.fs.ls() 并且可以在临时位置看到该文件。

所以有一些问题想问各位好心人:

  1. 为什么我们以前在读取 GeoJSON 而不是 csv 文件时必须使用“/dbfs/”,预更改我们的环境?
  2. 在没有设置挂载点的情况下将 GeoJSON 文件读入数据块的正确方法是什么?
  3. 为什么我们的进程在尝试读取第二个创建的临时 GeoJSON 文件时失败?

在此先感谢您的帮助 - Databricks 非常新...!

Pandas 使用本地文件 API 访问文件,而您通过提供 local file API/dbfs 访问 DBFS 上的文件。在您的具体情况下,问题是即使您使用 dbutils.fs.cp,您也没有指定要在本地复制文件,并且默认情况下它被复制到路径为 /dbfs/tmp/temp_nights 的 DBFS(实际上是dbfs:/dbfs/tmp/temp_nights),因此本地文件 API 看不到它 - 您将需要改用 /dbfs/dbfs/tmp/temp_nights,或将文件复制到 /tmp/temp_nights.

但更好的方法是在本地复制文件 - 您只需要指定目标是本地的 - 这是用 file:// 前缀完成的,如下所示:

dbutils.fs.cp("wasbs://Z@Y.blob.core.windows.net/...Nights_new.geojson", 
   "file:///tmp/temp_nights")

然后从/tmp/temp_nights读取文件:

nights = gpd.read_file(filename="/tmp/temp_nights")