Modellare dati semistrutturati
Questo articolo consiglia modelli per l'archiviazione di dati semistrutturati a seconda del modo in cui l'organizzazione usa i dati. Azure Databricks fornisce funzioni, tipi di dati nativi e sintassi di query per lavorare con dati semistrutturati, annidati e complessi.
Le considerazioni seguenti influisce sul modello da usare:
- I campi o i tipi nell'origine dati cambiano frequentemente?
- Quanti campi univoci totali sono contenuti nell'origine dati?
- È necessario optimize i carichi di lavoro per operazioni di scrittura o lettura?
Databricks consiglia di archiviare i dati come tables Delta per le query downstream.
Usare variant
In Databricks Runtime 15.3 e versioni successive è possibile usare il VARIANT
tipo per archiviare dati JSON semistrutturati usando una codifica ottimizzata che supera le stringhe JSON per letture e scritture.
Il VARIANT
tipo ha applicazioni simili alle stringhe JSON. Alcuni carichi di lavoro traggono comunque vantaggio dall'uso di struct, mappe e matrici, in particolare per i dati con schemi noti che potrebbero trarre vantaggio dalla raccolta ottimizzata di layout e statistiche dei dati.
Per altri dettagli, vedere gli articoli seguenti:
- Eseguire query sui dati varianti
- In che modo la variante è diversa dalle stringhe JSON?
- Inserire dati come tipo variant semistrutturato
Usare stringhe JSON
È possibile archiviare i dati in una singola stringa column usando la formattazione standard JSON e quindi eseguire query sui campi nel JSON usando la notazione :
.
Molti sistemi generano record JSON come record JSON con codifica stringa o byte. L'inserimento e l'archiviazione di questi record come stringhe comportano un sovraccarico di elaborazione molto basso. È anche possibile usare la to_json
funzione per trasformare qualsiasi struct di dati in una stringa JSON.
Quando si sceglie di archiviare i dati come stringhe JSON, considerare i punti di forza e i punti deboli seguenti:
- Tutte le values vengono archiviate come stringhe senza informazioni sul tipo.
- JSON supporta tutti i tipi di dati che possono essere rappresentati tramite testo.
- JSON supporta stringhe di lunghezza arbitraria.
- Non esistono limiti al numero di campi che possono essere rappresentati in un singolo dati JSON column.
- I dati non richiedono alcuna pre-elaborazione prima di essere scritti nel table.
- È possibile risolvere i problemi di tipo presenti nei dati nei carichi di lavoro downstream.
- JSON offre le prestazioni peggiori in lettura, perché è necessario analizzare l'intera stringa per ogni query.
Le stringhe JSON offrono una grande flessibilità e una soluzione facile da implementare per ottenere dati non elaborati in un lakehouse table. È possibile scegliere di usare stringhe JSON per molte applicazioni, ma sono particolarmente utili quando il risultato più importante di un carico di lavoro archivia una rappresentazione completa e accurata di un'origine dati per l'elaborazione downstream. Alcuni casi d'uso possono includere:
- Inserimento di dati di streaming da un servizio di accodamento, ad esempio Kafka.
- Registrazione delle risposte alle query dell'API REST.
- Archiviazione di record non elaborati da un'origine dati upstream non controllata dal team.
Supponendo che la logica di inserimento sia flessibile, l'archiviazione dei dati come stringa JSON deve essere resiliente anche se si verificano nuovi campi, modifiche alla struttura dei dati o modifiche al tipo nell'origine dati. Anche se i carichi di lavoro downstream potrebbero fallire a causa di queste modifiche, il table contiene una cronologia completa dei dati di origine, ovvero è possibile correggere i problemi senza dover tornare alla fonte dei dati.
Usare le strutture
È possibile archiviare dati semistrutturati con struct e abilitare tutte le funzionalità native di columns mantenendo al tempo stesso la struttura annidata dell'origine dati.
Delta Lake considera i dati archiviati come struct uguali a qualsiasi altro columns, ovvero non esiste alcuna differenza funzionale da struct e columns. I file di dati Parquet usati da Delta Lake creano un column per ogni campo in una struttura. È possibile utilizzare i campi delle strutture per il clustering columns o il partizionamento columnse raccogliere statistiche sulle strutture per saltare i dati.
Gli struct offrono in genere le migliori prestazioni durante la lettura, poiché supportano tutte le ottimizzazioni per il salto dei dati e memorizzano i singoli campi come columns. Le prestazioni possono iniziare a peggiorare quando il numero di columns presenti raggiunge centinaia.
Ogni campo in una struct ha un tipo di dati, che viene applicato allo stesso modo di columnsdurante la scrittura. Di conseguenza, gli struct richiedono la pre-elaborazione completa dei dati. Ciò può essere utile quando si vuole solo eseguire il commit dei dati convalidati in un table, ma può causare l'eliminazione di dati o processi non riusciti durante l'elaborazione di record in formato non valido da sistemi upstream.
Gli struct sono meno flessibili rispetto ai flussi JSON per l'adattamento schema, sia quando si tratta di evolvere i tipi di dati che di aggiungere nuovi campi.
Usare mappe e matrici
È possibile usare una combinazione di mappe e matrici per replicare i formati di dati semistrutturati in modo nativo in Delta Lake. Le statistiche non possono essere raccolte nei campi definiti con questi tipi, ma offrono prestazioni bilanciate sia in lettura che in scrittura per set di dati semistrutturati con circa 500 campi.
Sia la chiave che il valore delle mappe vengono tipizzati, quindi i dati vengono pre-elaborati e schema viene applicato in fase di scrittura.
Per accelerare le query, Databricks consiglia di archiviare i campi spesso usati per filtrare i dati come entità separate columns.
È necessario rendere flat i dati?
Se si archiviano i dati usando JSON o mappe, è consigliabile archiviare i campi usati di frequente per filtrare le query come columns. La raccolta delle statistiche, il partizionamento e il clustering non sono disponibili per i campi all'interno di stringhe o mappe JSON. Non è necessario eseguire questa operazione per i dati archiviati come struct.
Sintassi per l'uso di dati annidati
Esaminare le risorse seguenti per informazioni sull'uso dei dati annidati: