Condividi tramite


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 ottimizzare i carichi di lavoro per operazioni di scrittura o lettura?

Databricks consiglia di archiviare i dati come tabelle 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:

Usare stringhe JSON

È possibile archiviare i dati in una colonna di tipo stringa usando la formattazione JSON standard e quindi eseguire query sui campi del 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:

  • Tutti i valori vengono archiviati 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 una singola colonna di dati JSON.
  • I dati non richiedono alcuna pre-elaborazione prima della scrittura nella tabella.
  • È 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 inserire dati grezzi in una tabella lakehouse. È 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 non riuscire a causa di queste modifiche, la tabella contiene una cronologia completa dei dati di origine, ovvero è possibile risolvere i problemi senza dover tornare all'origine dati.

Usare le strutture

È possibile archiviare dati semistrutturati con struct e abilitare tutte le funzionalità native delle colonne mantenendo al tempo stesso la struttura annidata dell'origine dati.

Delta Lake considera i dati archiviati come struct uguali a qualsiasi altra colonna, vale a dire che non esiste alcuna differenza funzionale da struct e colonne. I file di dati Parquet usati da Delta Lake creano una colonna per ogni campo in una struttura. È possibile usare i campi struct come colonne di clustering o colonne di partizionamento ed è possibile raccogliere statistiche sugli struct per ignorare i dati.

Gli struct offrono in genere le migliori prestazioni durante la lettura, poiché supportano tutte le ottimizzazioni per saltare i dati e memorizzano singoli campi come colonne. Le prestazioni iniziano a diminuire quando il numero di colonne presenti raggiunge alcune centinaia.

Ogni campo in una struct ha un tipo di dati, che viene imposto in fase di scrittura allo stesso modo delle colonne. 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 una tabella, 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'evoluzione dello schema, sia per i tipi di dati in evoluzione che per l'aggiunta di 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 sono tipizzati, quindi i dati vengono pre-elaborati e lo schema viene applicato durante la scrittura.

Per accelerare le query, Databricks consiglia di archiviare campi spesso usati per filtrare i dati come colonne separate.

È 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 colonne. 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: