sparklyr.sedona
agora está disponível como o sparklyr
interface R baseada em Apache Sedona.
Para instalar sparklyr.sedona
do GitHub usando o remotes
pacote, execute
remotes::install_github(repo = "apache/incubator-sedona", subdir = "R/sparklyr.sedona")
Nesta postagem do weblog, forneceremos uma introdução rápida ao sparklyr.sedona
descrevendo a motivação por trás disso sparklyr
extensão, e apresentando alguns exemplos sparklyr.sedona
casos de uso envolvendo RDDs espaciais do Spark, dataframes do Spark e visualizações.
Motivação para sparklyr.sedona
Uma sugestão do
resultados da pesquisa mlverse no início deste ano mencionou a necessidade de interfaces R atualizadas para estruturas GIS baseadas em Spark. Ao analisar esta sugestão, aprendemos sobre
Apache Sedonaum sistema de dados geoespaciais desenvolvido pela Spark que é moderno, eficiente e fácil de usar. Também percebemos que, embora nossos amigos da comunidade de código aberto Spark tenham desenvolvido um
sparklyr
extensão para o GeoSpark, o antecessor do Apache Sedona, ainda não havia uma extensão semelhante que tornasse as funcionalidades mais recentes do Sedona facilmente acessíveis a partir do R. Decidimos, portanto, trabalhar sparklyr.sedona
que visa preencher a lacuna entre Sedona e R.
A configuração do terreno
Esperamos que você esteja pronto para um rápido tour por algumas das funcionalidades baseadas em RDD e em Spark dataframe em sparklyr.sedona
e também algumas visualizações deslumbrantes derivadas de dados geoespaciais no Spark.
Em Apache Sedona,
Conjuntos de dados distribuídos com resiliência espacial(SRDDs) são blocos básicos de construção de dados espaciais distribuídos que encapsulam “vanilla” RDDs de objetos geométricos e índices. Os SRDDs suportam operações de baixo nível, como transformações do Sistema de Referência de Coordenadas (CRS), particionamento espacial e indexação espacial. Por exemplo, com sparklyr.sedona
as operações baseadas em SRDD que podemos realizar incluem o seguinte:
- Importando alguma fonte de dados externa para um SRDD:
library(sparklyr)
library(sparklyr.sedona)
sedona_git_repo <- normalizePath("~/incubator-sedona")
data_dir <- file.path(sedona_git_repo, "core", "src", "take a look at", "assets")
sc <- spark_connect(grasp = "native")
pt_rdd <- sedona_read_dsv_to_typed_rdd(
sc,
location = file.path(data_dir, "arealm.csv"),
kind = "level"
)
- Aplicando particionamento espacial a todos os pontos de dados:
sedona_apply_spatial_partitioner(pt_rdd, partitioner = "kdbtree")
- Construindo índice espacial em cada partição:
sedona_build_index(pt_rdd, kind = "quadtree")
- Unir um conjunto de dados espaciais a outro usando “comprise” ou “overlap” como predicado de junção:
polygon_rdd <- sedona_read_dsv_to_typed_rdd(
sc,
location = file.path(data_dir, "primaryroads-polygon.csv"),
kind = "polygon"
)
pts_per_region_rdd <- sedona_spatial_join_count_by_key(
pt_rdd,
polygon_rdd,
join_type = "comprise",
partitioner = "kdbtree"
)
Vale a pena mencionar que sedona_spatial_join()
realizará particionamento espacial e indexação nas entradas usando o partitioner
e index_type
somente se as entradas não estiverem particionadas ou indexadas conforme já especificado.
A partir dos exemplos acima, pode-se ver que os SRDDs são ótimos para operações espaciais que exigem controle refinado, por exemplo, para garantir que uma consulta de junção espacial seja executada da maneira mais eficiente possível com os tipos corretos de particionamento e indexação espacial.
Finalmente, podemos tentar visualizar o resultado da junção acima, usando um mapa coroplético:
o que nos dá o seguinte:

Espere, mas algo parece errado. Para deixar a visualização acima mais bonita, podemos sobrepô-la com o contorno de cada região 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
)
o que nos dá o seguinte:

Com algumas operações espaciais de baixo nível realizadas usando a API SRDD e o particionamento espacial correto e estruturas de dados de indexação, podemos então importar os resultados de SRDDs para dataframes Spark. Ao trabalhar com objetos espaciais em dataframes Spark, podemos escrever consultas declarativas de alto nível nesses objetos usando dplyr
verbos em conjunto com Sedona
UDFs espaciaispor exemplo, a consulta a seguir nos diz se cada um dos 8
os polígonos mais próximos do ponto de consulta contêm esse ponto e também a casca convexa 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
1
Agradecimentos
O autor desta postagem do weblog gostaria de agradecer Jia Yuo criador do Apache Sedona, e Lorenz Waltert pela sugestão de contribuir sparklyr.sedona
para o montante
incubadora-sedona repositório. Jia forneceu amplo suggestions de revisão de código para garantir sparklyr.sedona
está em conformidade com os padrões de codificação e melhores práticas do projeto Apache Sedona e também tem sido muito útil na instrumentação de fluxos de trabalho de CI, verificando sparklyr.sedona
funciona conforme o esperado com versões instantâneas de bibliotecas Sedona de ramificações de desenvolvimento.
O autor também agradece ao seu colega Sigrid Keydana
para sugestões editoriais valiosas nesta postagem do weblog.
Isso é tudo. Obrigado por ler!
Foto de NASA sobre Remover respingo
Reutilizar
Texto e figuras estão licenciados sob Inventive Commons Attribution CC POR 4,0. As figuras que foram reutilizadas de outras fontes não se enquadram nesta licença e podem ser reconhecidas por uma nota na sua legenda: “Figura de …”.
Citação
Para atribuição, cite este trabalho como
Li (2021, July 7). Posit AI Weblog: sparklyr.sedona: A sparklyr extension for analyzing geospatial information. Retrieved from https://blogs.rstudio.com/tensorflow/posts/2021-07-07-sparklyr-sedona/
Citação BibTeX
@misc{sparklyr-sedona, writer = {Li, Yitao}, title = {Posit AI Weblog: sparklyr.sedona: A sparklyr extension for analyzing geospatial information}, url = {https://blogs.rstudio.com/tensorflow/posts/2021-07-07-sparklyr-sedona/}, 12 months = {2021} }