sparklyr.sedona
ahora está disponible como el sparklyr
interfaz R basada en apache sedona.
Para instalar sparklyr.sedona
desde GitHub usando el remotes
paquete, ejecutar
remotes::install_github(repo = "apache/incubator-sedona", subdir = "R/sparklyr.sedona")
En esta publicación de weblog, brindaremos una introducción rápida a sparklyr.sedona
describiendo la motivación detrás de esto sparklyr
extensión, y presentando algún ejemplo sparklyr.sedona
casos de uso que involucran RDD espaciales de Spark, marcos de datos de Spark y visualizaciones.
Motivación para sparklyr.sedona
Una sugerencia de la
resultados de la encuesta mlverse A principios de este año se mencionó la necesidad de interfaces R actualizadas para marcos SIG basados en Spark. Mientras analizamos esta sugerencia, aprendimos sobre
apache sedonaun sistema de datos geoespaciales impulsado por Spark que es moderno, eficiente y fácil de usar. También nos dimos cuenta de que, si bien nuestros amigos de la comunidad de código abierto Spark habían desarrollado un
sparklyr
extensión para GeoSpark, el predecesor de Apache Sedona, todavía no existía una extensión related que hiciera que las funcionalidades más recientes de Sedona fueran fácilmente accesibles desde R. Por ello decidimos trabajar en sparklyr.sedona
cuyo objetivo es cerrar la brecha entre Sedona y R.
La disposición del terreno
Esperamos que esté listo para un recorrido rápido por algunas de las funcionalidades basadas en RDD y Spark-dataframe en sparklyr.sedona
y también algunas visualizaciones deslumbrantes derivadas de datos geoespaciales en Spark.
En Apache Sedona,
Conjuntos de datos distribuidos resilientes espaciales(SRDD) son bloques de construcción básicos de datos espaciales distribuidos que encapsulan “vainilla” RDDs de objetos geométricos e índices. Los SRDD admiten operaciones de bajo nivel, como transformaciones del sistema de referencia de coordenadas (CRS), partición espacial e indexación espacial. Por ejemplo, con sparklyr.sedona
Las operaciones basadas en SRDD que podemos realizar incluyen las siguientes:
- Importar alguna fuente de datos externa a un SRDD:
library(sparklyr)
library(sparklyr.sedona)
sedona_git_repo <- normalizePath("~/incubator-sedona")
data_dir <- file.path(sedona_git_repo, "core", "src", "check", "assets")
sc <- spark_connect(grasp = "native")
pt_rdd <- sedona_read_dsv_to_typed_rdd(
sc,
location = file.path(data_dir, "arealm.csv"),
sort = "level"
)
- Aplicar partición espacial a todos los puntos de datos:
sedona_apply_spatial_partitioner(pt_rdd, partitioner = "kdbtree")
- Construyendo un índice espacial en cada partición:
sedona_build_index(pt_rdd, sort = "quadtree")
- Unir un conjunto de datos espaciales con otro utilizando “contener” o “superponer” como predicado de unión:
polygon_rdd <- sedona_read_dsv_to_typed_rdd(
sc,
location = file.path(data_dir, "primaryroads-polygon.csv"),
sort = "polygon"
)
pts_per_region_rdd <- sedona_spatial_join_count_by_key(
pt_rdd,
polygon_rdd,
join_type = "include",
partitioner = "kdbtree"
)
Vale la pena mencionar que sedona_spatial_join()
realizará la partición espacial y la indexación de las entradas utilizando el partitioner
y index_type
sólo si las entradas no están particionadas o indexadas como ya se ha especificado.
En los ejemplos anteriores, se puede ver que los SRDD son excelentes para operaciones espaciales que requieren un management detallado, por ejemplo, para garantizar que una consulta de unión espacial se ejecute de la manera más eficiente posible con los tipos correctos de división e indexación espacial.
Finalmente, podemos intentar visualizar el resultado de la unión anterior, usando un mapa de coropletas:
lo que nos da lo siguiente:

Espera, pero algo parece andar mal. Para que la visualización anterior se vea mejor, podemos superponerla con el contorno de cada región poligonal:
contours <- sedona_render_scatter_plot(
polygon_rdd,
resolution_x = 1000,
resolution_y = 600,
output_location = tempfile("scatter-plot-"),
boundary = c(-126.790180, -64.630926, 24.863836, 50.000),
base_color = c(255, 0, 0),
browse = FALSE
)
sedona_render_choropleth_map(
pts_per_region_rdd,
resolution_x = 1000,
resolution_y = 600,
output_location = tempfile("choropleth-map-"),
boundary = c(-126.790180, -64.630926, 24.863836, 50.000),
base_color = c(63, 127, 255),
overlay = contours
)
lo que nos da lo siguiente:

Con algunas operaciones espaciales de bajo nivel atendidas utilizando la API SRDD y las estructuras de datos de indexación y partición espacial adecuadas, podemos importar los resultados de los SRDD a los marcos de datos de Spark. Cuando trabajamos con objetos espaciales dentro de marcos de datos de Spark, podemos escribir consultas declarativas de alto nivel sobre estos objetos usando dplyr
verbos en conjunto con Sedona
UDF espacialespor ejemplo, la siguiente consulta nos cube si cada uno de los 8
Los polígonos más cercanos al punto de consulta contienen ese punto y también el casco convexo de cada polígono.
tbl <- DBI::dbGetQuery(
sc, "SELECT ST_GeomFromText("POINT(-66.3 18)") AS `pt`"
)
pt <- tbl$pt[[1]]
knn_rdd <- sedona_knn_query(
polygon_rdd, x = pt, okay = 8, index_type = "rtree"
)
knn_sdf <- knn_rdd %>%
sdf_register() %>%
dplyr::mutate(
contains_pt = ST_contains(geometry, ST_Point(-66.3, 18)),
convex_hull = ST_ConvexHull(geometry)
)
knn_sdf %>% print()
# Supply: spark<?> [?? x 3]
geometry contains_pt convex_hull
<record> <lgl> <record>
1 <POLYGON ((-66.335674 17.986328… TRUE <POLYGON ((-66.335674 17.986328,…
2 <POLYGON ((-66.335432 17.986626… TRUE <POLYGON ((-66.335432 17.986626,…
3 <POLYGON ((-66.335432 17.986626… TRUE <POLYGON ((-66.335432 17.986626,…
4 <POLYGON ((-66.335674 17.986328… TRUE <POLYGON ((-66.335674 17.986328,…
5 <POLYGON ((-66.242489 17.988637… FALSE <POLYGON ((-66.242489 17.988637,…
6 <POLYGON ((-66.242489 17.988637… FALSE <POLYGON ((-66.242489 17.988637,…
7 <POLYGON ((-66.24221 17.988799,… FALSE <POLYGON ((-66.24221 17.988799, …
8 <POLYGON ((-66.24221 17.988799,… FALSE <POLYGON ((-66.24221 17.988799, …
Expresiones de gratitud
El autor de esta entrada de weblog desea agradecer Jiayuel creador de Apache Sedona, y Lorenz Walthert por su sugerencia de contribuir sparklyr.sedona
a la corriente arriba
incubadora-sedona repositorio. Jia ha proporcionado comentarios extensos sobre la revisión del código para garantizar sparklyr.sedona
Cumple con los estándares de codificación y las mejores prácticas del proyecto Apache Sedona, y también ha sido de gran ayuda en la instrumentación de la verificación de flujos de trabajo de CI. sparklyr.sedona
funciona como se esperaba con versiones instantáneas de las bibliotecas de Sedona de las ramas de desarrollo.
El autor también agradece a su colega. Sigrid Keydana
para sugerencias editoriales valiosas en esta publicación de weblog.
Eso es todo. ¡Gracias por leer!
Foto por NASA en desempaquetar