Leggere e scrivere in file CSV

Questo articolo fornisce esempi per la lettura e la scrittura in file CSV con Azure Databricks usando Python, Scala, R e SQL.

Nota

Databricks consiglia di read_files funzione con valori di tabella per consentire agli utenti SQL di leggere i file CSV. read_files è disponibile in Databricks Runtime 13.3 LTS e versioni successive.

È anche possibile usare una visualizzazione temporanea. Se si usa SQL per leggere i dati CSV direttamente senza usare visualizzazioni temporanee o read_files, si applicano le limitazioni seguenti:

Opzioni

È possibile configurare diverse opzioni per le origini dati dei file CSV. Vedere gli articoli di riferimento di Apache Spark seguenti per le opzioni di lettura e scrittura supportate.

Usare record CSV in formato non valido

Quando si leggono file CSV con uno schema specificato, è possibile che i dati nei file non corrispondano allo schema. Ad esempio, un campo contenente il nome della città non verrà analizzato come numero intero. Le conseguenze dipendono dalla modalità in cui viene eseguito il parser:

  • PERMISSIVE (impostazione predefinita): i valori Null vengono inseriti per i campi che non possono essere analizzati correttamente
  • DROPMALFORMED: elimina le righe che contengono campi che non possono essere analizzati
  • FAILFAST: interrompe la lettura se vengono trovati dati in formato non valido

Per impostare la modalità, usare l'opzione mode .

diamonds_df = (spark.read
  .format("csv")
  .option("mode", "PERMISSIVE")
  .load("/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv")
)

PERMISSIVE Nella modalità è possibile esaminare le righe che non è stato possibile analizzare correttamente usando uno dei metodi seguenti:

  • È possibile fornire un percorso personalizzato all'opzione badRecordsPath per registrare i record danneggiati in un file.
  • È possibile aggiungere la colonna _corrupt_record allo schema fornito al DataFrameReader per esaminare i record danneggiati nel dataframe risultante.

Nota

L'opzione badRecordsPath ha la precedenza su _corrupt_record, ovvero le righe in formato non valido scritte nel percorso specificato non vengono visualizzate nel dataframe risultante.

Il comportamento predefinito per i record in formato non valido cambia quando si usa la colonna di dati salvata.

Trovare un blocco appunti righe in formato non valido

Ottenere il notebook

Colonna di dati salvata

Nota

Questa funzionalità è supportata in Databricks Runtime 8.3 (non supportato) e versioni successive.

Quando si usa la PERMISSIVE modalità , è possibile abilitare la colonna di dati salvata per acquisire tutti i dati che non sono stati analizzati perché uno o più campi in un record presentano uno dei problemi seguenti:

  • Assente dallo schema fornito.
  • Non corrisponde al tipo di dati dello schema fornito.
  • Ha una mancata corrispondenza tra maiuscole e minuscole con i nomi dei campi nello schema fornito.

La colonna di dati salvata viene restituita come documento JSON contenente le colonne salvate e il percorso del file di origine del record. Per rimuovere il percorso del file di origine dalla colonna di dati salvata, è possibile impostare la configurazione spark.conf.set("spark.databricks.sql.rescuedDataColumn.filePath.enabled", "false")SQL . È possibile abilitare la colonna di dati salvata impostando l'opzione rescuedDataColumn su un nome di colonna durante la lettura dei dati, ad esempio _rescued_data con spark.read.option("rescuedDataColumn", "_rescued_data").format("csv").load(<path>).

Il parser CSV supporta tre modalità durante l'analisi dei record: PERMISSIVE, DROPMALFORMEDe FAILFAST. Se usato insieme a rescuedDataColumn, le mancate corrispondenze del tipo di dati non causano l'eliminazione dei record in DROPMALFORMED modalità o generano un errore in FAILFAST modalità . Solo i record danneggiati, ovvero csv incompleti o in formato non valido, vengono eliminati o generati errori.

Quando rescuedDataColumn viene usato in PERMISSIVE modalità , le regole seguenti si applicano ai record danneggiati:

  • La prima riga del file (una riga di intestazione o una riga di dati) imposta la lunghezza prevista della riga.
  • Una riga con un numero diverso di colonne viene considerata incompleta.
  • Le mancate corrispondenze del tipo di dati non sono considerate record danneggiati.
  • Solo i record CSV incompleti e in formato non valido vengono considerati danneggiati e registrati nella _corrupt_record colonna o badRecordsPath.

Esempio SQL: Leggere il file CSV

Nell'esempio SQL seguente viene letto un file CSV usando read_files.

-- mode "FAILFAST" aborts file parsing with a RuntimeException if malformed lines are encountered
SELECT * FROM read_files(
  's3://<bucket>/<path>/<file>.csv',
  format => 'csv',
  header => true,
  mode => 'FAILFAST')

Esempi di Scala, R e Python: Leggere il file CSV

Il notebook seguente illustra come leggere un file, visualizzare i dati di esempio e stampare lo schema dei dati usando Scala, R e Python. Gli esempi in questa sezione usano il set di dati diamond. Specificare il percorso del set di dati e tutte le opzioni desiderate.

Leggere il notebook dei file CSV

Ottenere il notebook

Esempio: Specificare lo schema

Quando lo schema del file CSV è noto, è possibile specificare lo schema desiderato per il lettore CSV con l'opzione schema .

Leggere i file CSV con il notebook dello schema

Ottenere il notebook

Esempio di SQL con read_files:

SELECT * FROM read_files(
  's3://<bucket>/<path>/<file>.csv',
  format => 'csv',
  header => false,
  schema => 'id string, date date, event_time timestamp')

Esempio: Errori di lettura di un subset di colonne

Il comportamento del parser CSV dipende dal set di colonne lette. Se lo schema specificato non è corretto, i risultati potrebbero variare notevolmente a seconda del subset di colonne a cui si accede. Il notebook seguente presenta le insidie più comuni.

Avvertenze per la lettura di un subset di colonne di un notebook di file CSV

Ottenere il notebook