在数据块中读取 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() 并且可以在临时位置看到该文件。
所以有一些问题想问各位好心人:
- 为什么我们以前在读取 GeoJSON 而不是 csv 文件时必须使用“/dbfs/”,预更改我们的环境?
- 在没有设置挂载点的情况下将 GeoJSON 文件读入数据块的正确方法是什么?
- 为什么我们的进程在尝试读取第二个创建的临时 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")
我们最近更改了从 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() 并且可以在临时位置看到该文件。
所以有一些问题想问各位好心人:
- 为什么我们以前在读取 GeoJSON 而不是 csv 文件时必须使用“/dbfs/”,预更改我们的环境?
- 在没有设置挂载点的情况下将 GeoJSON 文件读入数据块的正确方法是什么?
- 为什么我们的进程在尝试读取第二个创建的临时 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")