Het up-to-date houden van ruimtelijke gegevens is een veelvoorkomende uitdaging bij werken op grote schaal, vooral wanneer analyseresultaten continu terug naar operationele systemen moeten worden gepubliceerd. Met ArcGIS GeoAnalytics for Fabric kunt u analyse-uitvoer direct naar feature services schrijven. Bij het bijwerken van feature services wilt u mogelijk niet alles herschrijven bij elke update. Met de upsert-optie kunt u bestaande features bijwerken en nieuwe toevoegen in één enkele, efficiënte bewerking. In dit bericht bekijken we hoe upsert incrementele updates aan feature services vereenvoudigt, waardoor u autoritatieve lagen actueel houdt terwijl stabiele feature-ID's behouden blijven en downstream-apps en dashboards worden ondersteund.
In deze blogpost lopen we het proces door om te laten zien hoe het werkt. Ter demonstratie maken we een nieuwe feature service, lezen de gegevens uit die feature service, voeren een update uit op een paar rijen en gebruiken vervolgens upsert om alleen die rijen in onze opgeslagen feature service te wijzigen met de bijgewerkte gegevens.
Maak een feature service aan
Om te demonstreren hoe upsert werkt, beginnen we met het maken van een feature service. Om het eenvoudig te houden, lezen we gewoon een datalaag uit Esri's Living Atlas of the World en schrijven die naar ons account in ArcGIS Online. Dit wordt onze "nieuwe" feature service die we zullen bijwerken.
Eerst importeren we de GeoAnalytics for Fabric-bibliotheek en de Pyspark SQL-functies
# imports
import geoanalytics_fabric
import pyspark.sql.functions as F
Vervolgens lezen we een dataset van grote steden in de VS om als voorbeeldgegevens te gebruiken. In dit geval gebruiken we slechts een paar attributen van de oorspronkelijke Living Atlas feature service. Voor dit voorbeeld verwijderen we het OBJECTID-veld dat automatisch wordt gegenereerd in een Feature Service en vervangen het door een veld genaamd "My_ID." Dit wordt alleen gebruikt om de creatie van een unieke geïndexeerde OBJECTID te tonen wanneer we onze nieuwe feature service schrijven (anders krijgen we een tweede OBJECTID-veld wanneer we het in de volgende stap van onze demonstratie schrijven).
# lees een dataset in als voorbeeld voor upsert
# US major cities dataset van 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") # verwijder het originele OBJECTID-veld omdat we My_ID als upsert-matchveld gaan gebruiken
display(myFSDataFrame)
Met de resulterende DataFrame als onze voorbeelddataset schrijven we die naar ons ArcGIS Online-account zodat we een nieuwe feature service hebben die we kunnen bewerken.
Daartoe verbinden we met ons ArcGIS Online-account:
# registreer een gis waar we de data naartoe schrijven - met AGOL-inloggegevens
geoanalytics_fabric.register_gis("myGIS", "https://arcgis.com", username="my_username", password="my_password")En dan schrijven we de DataFrame naar ons ArcGIS Online-account. Let op dat wanneer we deze initiële schrijfoperatie uitvoeren, we een upsertMatchingField instellen. Dit specificeert het laagveld dat wordt gebruikt bij het matchen van features met upsert. We kunnen elk veld gebruiken dat een unieke index heeft – en in dit geval is dat "My_ID," een unieke identifier.
Wanneer we onze nieuwe laag maken en het upsertMatchingField specificeren, wordt er een unieke index gemaakt op ons opgegeven veld (My_ID).
# schrijf naar mijn gis
# geef aan dat het veld "My_ID" het upsert-veld zal zijn (maakt unieke index)
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()Werk enkele van onze gegevens bij
We kunnen de gegevens weer ophalen uit deze laag om te bevestigen dat de inhoud is zoals verwacht, en vervolgens enkele rijen identificeren die we zullen bijwerken met upsert. Let op dat we de optie specificeren om verbinding te maken met ons ArcGIS Online-account. Het is belangrijk ervoor te zorgen dat u het ArcGIS Online-account hebt geregistreerd waar uw data zich bevindt zodat u toegang hebt tot de data voor lezen en schrijven!
# lees onze data uit de nieuwe feature service - deze DataFrame gebruiken we om de upsert-functionaliteit te demonstreren
myNewFS = "https://your_service_URL"
myNewFSDataFrame = spark.read.format('feature-service')\
.option("gis", "myGIS")\
.load(myNewFS)
display(myNewFSDataFrame)

Onze nieuwe feature service bevat al onze originele velden plus een nieuw OBJECTID-veld dat automatisch werd aangemaakt toen we de feature service schreven.
Laten we nu eens kijken wat er gebeurt als we slechts een deel van onze data willen bijwerken. Om het eenvoudig te houden, werken we alleen de records bij met de eerste twee ID's – met andere woorden, we vervangen "Alabaster" door "New City 1" en "Albertville" door "New City 2":
# bewerk twee rijen om bij te werken
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)
Als we onze feature service op ArcGIS Online willen bijwerken met deze nieuwe records – maar alleen deze twee rijen data willen bijwerken 93 kunnen we daarvoor upsert gebruiken. Laten we deze DataFrame met alleen de twee bijgewerkte rijen terugschrijven naar onze feature service. Wanneer we deze data terugschrijven, zetten we de modus op "append" en specificeren ons upsertMatchingField als "My_ID." Dit zal de unieke ID's voor die records matchen en alleen voor die rijen de attributen vervangen.
# schrijf de bijgewerkte rijen terug naar de feature service met 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()Nu kunnen we controleren of de wijzigingen zijn doorgevoerd door onze feature service opnieuw in te lezen en naar de data te kijken:
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)

En er hoefden maar twee rijen bijgewerkt te worden! Dit is doorgaans efficiënter dan het hele tabel overschrijven.
Conclusie
Ik hoop dat dit een nuttige demonstratie is geweest over hoe u selectief feature services efficiënt kunt bijwerken met GeoAnalytics for Fabric!