Semi-gestructureerde gegevens modelleren
In dit artikel worden patronen aanbevolen voor het opslaan van semi-gestructureerde gegevens, afhankelijk van hoe uw organisatie de gegevens gebruikt. Azure Databricks biedt functies, systeemeigen gegevenstypen en querysyntaxis om te werken met semi-gestructureerde, geneste en complexe gegevens.
De volgende overwegingen zijn van invloed op het patroon dat u moet gebruiken:
- Veranderen de velden of typen in de gegevensbron regelmatig?
- Hoeveel unieke totaalvelden zijn opgenomen in de gegevensbron?
- Moet u uw workloads optimaliseren voor schrijf- of leesbewerkingen?
Databricks raadt aan om gegevens op te slaan als Delta-tabellen voor downstreamquery's.
Variant gebruiken
In Databricks Runtime 15.3 en hoger kunt u het VARIANT
type gebruiken om semi-gestructureerde JSON-gegevens op te slaan met behulp van een geoptimaliseerde codering waarmee JSON-tekenreeksen beter presteren voor lees- en schrijfbewerkingen.
Het VARIANT
type heeft vergelijkbare toepassingen als JSON-tekenreeksen. Sommige workloads profiteren nog steeds van het gebruik van structs, kaarten en matrices, met name voor gegevens met bekende schema's die profiteren van geoptimaliseerde gegevensindeling en statistiekenverzameling.
Zie de volgende artikelen voor meer informatie:
- Query's uitvoeren op variantgegevens
- Hoe verschilt variant dan JSON-tekenreeksen?
- Gegevens opnemen als semi-gestructureerd varianttype
JSON-tekenreeksen gebruiken
U kunt gegevens opslaan in één tekenreekskolom met behulp van standaard JSON-opmaak en vervolgens queryvelden in de JSON met behulp van :
notatie.
Veel systemen voeren records uit als tekenreeks- of byte-gecodeerde JSON-records. Het opnemen en opslaan van deze records omdat tekenreeksen een zeer lage verwerkingsoverhead hebben. U kunt de to_json
functie ook gebruiken om elke struct van gegevens om te zetten in een JSON-tekenreeks.
Houd rekening met de volgende sterke en zwakke punten bij het opslaan van gegevens als JSON-tekenreeksen:
- Alle waarden worden opgeslagen als tekenreeksen zonder typegegevens.
- JSON ondersteunt alle gegevenstypen die kunnen worden weergegeven met behulp van tekst.
- JSON ondersteunt tekenreeksen van willekeurige lengte.
- Er zijn geen limieten voor het aantal velden dat kan worden weergegeven in één JSON-gegevenskolom.
- Gegevens vereisen geen voorverwerking voordat ze naar de tabel worden geschreven.
- U kunt typeproblemen oplossen die aanwezig zijn in de gegevens in downstreamworkloads.
- JSON biedt de slechtste prestaties bij lezen, omdat u de hele tekenreeks voor elke query moet parseren.
JSON-tekenreeksen bieden veel flexibiliteit en een eenvoudig te implementeren oplossing voor het ophalen van onbewerkte gegevens in een Lakehouse-tabel. U kunt ervoor kiezen om JSON-tekenreeksen voor veel toepassingen te gebruiken, maar deze zijn vooral handig wanneer het belangrijkste resultaat van een workload een volledige en nauwkeurige weergave van een gegevensbron voor downstreamverwerking opslaat. Enkele gebruiksvoorbeelden kunnen zijn:
- Streaminggegevens opnemen uit een wachtrijservice zoals Kafka.
- Antwoorden opnemen REST API-query's.
- Onbewerkte records opslaan vanuit een upstream-gegevensbron die niet wordt beheerd door uw team.
Ervan uitgaande dat uw opnamelogica flexibel is, moet het opslaan van gegevens als een JSON-tekenreeks flexibel zijn, zelfs als u nieuwe velden, wijzigingen in de gegevensstructuur tegenkomt of wijzigingen in de gegevensbron typt. Hoewel downstreamworkloads mogelijk mislukken vanwege deze wijzigingen, bevat uw tabel een volledige geschiedenis van de brongegevens. Dit betekent dat u problemen kunt oplossen zonder dat u terug hoeft te gaan naar de gegevensbron.
Structs gebruiken
U kunt semi-gestructureerde gegevens opslaan met structs en alle systeemeigen functionaliteit van kolommen inschakelen terwijl de geneste structuur van de gegevensbron behouden blijft.
Delta Lake behandelt gegevens die zijn opgeslagen als structs hetzelfde als andere kolommen, wat betekent dat er geen functioneel verschil is van structs en kolommen. De Parquet-gegevensbestanden die door Delta Lake worden gebruikt, maken een kolom voor elk veld in een struct. U kunt struct-velden gebruiken als clusteringkolommen of partitioneringskolommen en u kunt statistieken verzamelen over structs voor het overslaan van gegevens.
Structs bieden over het algemeen de beste prestaties bij lezen, omdat ze alle optimalisaties voor het overslaan van gegevens ondersteunen en afzonderlijke velden opslaan als kolommen. De prestaties kunnen beginnen te lijden wanneer het aantal kolommen dat aanwezig is, in de honderden komt.
Elk veld in een struct heeft een gegevenstype, dat wordt afgedwongen bij het schrijven hetzelfde als kolommen. Daarom vereisen structs volledige voorverwerking van gegevens. Dit kan nuttig zijn wanneer u alleen gevalideerde gegevens wilt die zijn doorgevoerd in een tabel, maar kan leiden tot verwijderde gegevens of mislukte taken bij het verwerken van ongeldige records van upstream-systemen.
Structs zijn minder flexibel dan JSON-streams voor schemaontwikkeling, of dit nu het gaat om veranderende gegevenstypen of het toevoegen van nieuwe velden.
Kaarten en matrices gebruiken
U kunt een combinatie van kaarten en matrices gebruiken om semi-gestructureerde gegevensindelingen systeemeigen te repliceren in Delta Lake. Statistieken kunnen niet worden verzameld op velden die met deze typen zijn gedefinieerd, maar ze bieden evenwichtige prestaties voor zowel lezen als schrijven voor semi-gestructureerde gegevenssets met ongeveer 500 velden.
Zowel de sleutel als de waarde van kaarten worden getypt, zodat gegevens vooraf worden verwerkt en schema wordt afgedwongen bij schrijven.
Om query's te versnellen, raadt Databricks aan om velden op te slaan die vaak worden gebruikt om gegevens als afzonderlijke kolommen te filteren.
Moet ik mijn gegevens plat maken?
Als u uw gegevens opslaat met behulp van JSON of kaarten, kunt u overwegen velden op te slaan die vaak worden gebruikt voor het filteren van query's als kolommen. Statistiekenverzameling, partitionering en clustering zijn niet beschikbaar voor velden in JSON-tekenreeksen of kaarten. U hoeft dit niet te doen voor gegevens die zijn opgeslagen als structs.
Syntaxis voor het werken met geneste gegevens
Bekijk de volgende bronnen voor informatie over het werken met geneste gegevens: