Manter os dados espaciais atualizados é um desafio comum ao trabalhar em grande escala, especialmente quando os resultados das análises precisam ser continuamente publicados de volta aos sistemas operacionais. Com o ArcGIS GeoAnalytics para Fabric, você pode gravar os resultados da análise diretamente nos serviços de feição. Ao atualizar serviços de feição, você pode não querer reescrever tudo a cada atualização. Usando a opção upsert, você pode atualizar feições existentes e adicionar novas em uma única operação eficiente. Neste post, vamos ver como o upsert simplifica atualizações incrementais em serviços de feição, ajudando você a manter camadas autoritativas atualizadas enquanto preserva IDs de feição estáveis e suporta aplicativos e painéis downstream.
Neste post do blog, vamos passar pelo processo para fazer isso a fim de mostrar como funciona. Para demonstrar, criaremos um novo serviço de feição, leremos os dados desse serviço de feição, realizaremos uma atualização em algumas linhas e então usaremos o upsert para alterar apenas essas linhas no nosso serviço de feição salvo com os dados atualizados.
Criar um serviço de feição
Para demonstrar como o upsert funciona, começaremos criando um serviço de feição. Para manter as coisas simples, vamos apenas ler uma camada de dados do Living Atlas of the World da Esri e gravá-la em nossa conta no ArcGIS Online. Este será nosso serviço de feição "novo" que iremos atualizar.
Primeiro importamos a biblioteca GeoAnalytics para Fabric e as funções Pyspark SQL
# imports
import geoanalytics_fabric
import pyspark.sql.functions as F
Em seguida, vamos ler um conjunto de dados de principais cidades dos EUA para usar como nossos dados de exemplo. Neste caso, usaremos apenas alguns atributos do serviço original do Living Atlas. Para este exemplo, removeremos o campo OBJECTID que é gerado automaticamente em um Serviço de Feição e o substituiremos por um campo chamado "My_ID." Isso é usado apenas para mostrar a criação de um OBJECTID indexado único quando gravamos nosso novo serviço de feição (caso contrário, acabaríamos com um segundo campo OBJECTID quando o gravarmos na próxima etapa da demonstração).
# read in a dataset to use as an example for upsert
# US major cities dataset from ArcGIS Living Atlas of the World
myFS="https://services.arcgis.com/P3ePLMYs2RVChkJx/arcgis/rest/services/USA_Major_Cities_/FeatureServer/0"
myFSDataFrame = spark.read.format('feature-service').load(myFS)\
.select("OBJECTID", "NAME", "STATE_ABBR", "PLACE_FIPS", "SHAPE")\
.withColumn("My_ID", F.col("OBJECTID"))\
.drop("OBJECTID") # remove o campo OBJECTID original já que usaremos My_ID como campo para correspondência no upsert
display(myFSDataFrame)
Usando o DataFrame resultante como nosso conjunto de dados de amostra, vamos gravá-lo em nossa conta ArcGIS Online para termos um novo serviço de feição que podemos editar.
Para isso, vamos conectar à nossa conta ArcGIS Online:
# registrar um gis onde escreveremos os dados - usando credenciais AGOL
geoanalytics_fabric.register_gis("myGIS", "https://arcgis.com", username="my_username", password="my_password")E então gravamos o DataFrame na nossa conta ArcGIS Online. Note que ao fazermos essa gravação inicial, estamos definindo um upsertMatchingField. Isso especifica o campo da camada que será usado para correspondência das feições com upsert. Podemos usar qualquer campo que tenha índice único – neste caso, é "My_ID," um identificador único.
Quando criamos nossa nova camada e especificamos o upsertMatchingField, um índice único é criado no campo especificado (My_ID).
# gravar no meu gis
# especificando que o campo "My_ID" será o campo para upsert (cria índice único)
myFSDataFrame.write.format('feature-service')\
.option("gis", "myGIS")\
.option("serviceName", "us_cities_upsert_example_with_unique_index")\
.option("layerName", "layer")\
.option("upsertMatchingField", "My_ID")\
.save()Atualizar alguns dos nossos dados
Pode-se puxar os dados dessa camada para confirmar que o conteúdo está conforme esperado e então identificar algumas linhas que iremos atualizar usando upsert. Note que estamos especificando a opção para conectar à nossa conta ArcGIS Online. É importante garantir que você tenha registrado a conta ArcGIS Online onde seus dados estão armazenados para poder acessar os dados para leitura e gravação!
# ler nossos dados do novo serviço de feição - usaremos este DataFrame para demonstrar a funcionalidade upsert
myNewFS = "https://your_service_URL"
myNewFSDataFrame = spark.read.format('feature-service')\
.option("gis", "myGIS")\
.load(myNewFS)
display(myNewFSDataFrame)

Nosso novo serviço de feição tem todos os campos originais, além de um novo campo OBJECTID criado automaticamente quando gravamos o serviço de feição.
Agora vejamos o que acontece quando queremos atualizar um subconjunto dos nossos dados. Para simplificar, vamos atualizar apenas os registros com os dois primeiros IDs – ou seja, vamos substituir “Alabaster” por “New City 1” e “Albertville” por “New City 2”:
# editar duas linhas para atualizar
updated_row = myFSDataFrame.filter("My_ID in (1, 2)")\
.withColumn("NAME", F.when(F.col("My_ID") == 1, "New City Name 1").otherwise("New City Name 2"))
display(updated_row)
Se quisermos atualizar nosso serviço de feição no ArcGIS Online com esses novos registros – mas apenas atualizar essas duas linhas - podemos usar o upsert para isso. Vamos gravar este DataFrame com apenas as duas linhas atualizadas novamente no nosso serviço de feição. Ao gravarmos esses dados novamente, definimos o modo como “append” e especificamos nosso upsertMatchingField como “My_ID.” Isso fará a correspondência dos IDs únicos desses registros e trocará os atributos apenas dessas linhas.
# gravar as linhas atualizadas novamente no serviço de feição usando upsert
service_url = "https://your_service_URL"
updated_row.write.mode("append").format('feature-service')\
.option("gis", "myGIS")\
.option("serviceURL", service_url)\
.option("upsertMatchingField", "My_ID")\
.option("layerName", "layer")\
.save()Agora podemos verificar se as alterações foram aplicadas lendo novamente nosso serviço de feição e observando os dados:
myfs_upsert_url = "https://your_service_URL"
myFSDataFrame_after_upsert = spark.read.format('feature-service')\
.option("gis", "myGIS")\
.load(myfs_upsert_url)
display(myFSDataFrame_after_upsert)

E apenas duas linhas precisaram ser atualizadas! Isso normalmente será mais eficiente do que sobrescrever toda a tabela.
Conclusão
Espero que esta tenha sido uma demonstração útil sobre como você pode atualizar seletivamente serviços de feição eficientemente usando GeoAnalytics para Fabric!