read_files funzione con valori di tabella

Si applica a:segno di spunta sì Databricks SQL segno di spunta sì Databricks Runtime 13.3 LTS e versioni successive

Legge i file in un percorso specificato e restituisce i dati in formato tabulare.

Supporta la lettura dei formati di file JSON, CSV, XML, TEXT, BINARYFILE, PARQUET, AVRO e ORC. Può rilevare automaticamente il formato di file e dedurre uno schema unificato in tutti i file.

Sintassi

read_files(path [, option_key => option_value ] [...])

Argomenti

Questa funzione richiede la chiamata di parametri denominati per le chiavi di opzione.

  • path: un STRING con l'URI dell'ubicazione dei dati. Supporta la lettura da Azure Data Lake Storage ('abfss://'), S3 (s3://) e Google Cloud Storage ('gs://'). Può contenere glob. Vedi Scoperta dei file per ulteriori dettagli.
  • option_key: nome dell'opzione da configurare. È necessario usare i backtick () for options that contain dots (.`).
  • option_value: espressione costante su cui impostare l'opzione . Accetta valori letterali e funzioni scalari.

Restituiti

Tabella contenente i dati dei file letti nell'oggetto specificato path. Lo schema dipende dal formato di file:

  • BINARYFILE: restituisce uno schema fisso:

    colonna Tipo Descrizione
    path STRING Percorso completo del file.
    modificationTime TIMESTAMP Ora dell'ultima modifica del file.
    length LONG Le dimensioni del file in byte.
    content BINARY Contenuto binario del file. Usare * EXCEPT (content) per escludere il contenuto binario durante l'esecuzione di query sui metadati del file.
  • TEXT: restituisce uno schema fisso con una singola value colonna (STRING).

  • Tutti gli altri formati (JSON, CSV, XML, PARQUET, AVRO, ORC): lo schema viene dedotto dal contenuto del file o fornito in modo esplicito usando l'opzione schema .

_metadata Colonna

read_files espone una _metadata colonna con metadati a livello di file. Questa colonna non è inclusa nei SELECT * risultati e deve essere selezionata in modo esplicito. Include i seguenti campi:

Campo Tipo Descrizione
file_path STRING Percorso completo del file di origine.
file_name STRING Nome del file di origine.
file_size LONG Dimensioni del file di origine in byte.
file_modification_time TIMESTAMP Ora dell'ultima modifica del file di origine.
file_block_start LONG Inizio del blocco del file letto.
file_block_length LONG Lunghezza del blocco del file letto.

Per includere _metadata nei risultati, selezionarlo in modo esplicito:

SELECT * EXCEPT (content), _metadata
FROM read_files('/Volumes/my_catalog/my_schema/my_volume', format => 'binaryFile');

Scoperta file

read_files può leggere un singolo file o leggere i file in una directory specificata. read_files individua tutti i file nella directory specificata in modo ricorsivo, a meno che non venga fornito un GLOB , che indica read_files di ripetere il processo in un modello di directory specifico.

Filtro di directory o file usando modelli GLOB

I modelli Glob possono essere usati per filtrare directory e file quando specificati nel percorso.

Modello Descrizione
? Corrisponde a qualsiasi carattere singolo
* Corrisponde a zero o più caratteri
[abc] Trova la corrispondenza di un singolo carattere del set di caratteri {a,b,c}.
[a-z] Trova la corrispondenza di un singolo carattere dall'intervallo di caratteri {a... z}.
[^a] Trova la corrispondenza di un singolo carattere non incluso nel set di caratteri o nell'intervallo {a}. Si noti che il ^ carattere deve essere immediatamente a destra della parentesi aperta.
{ab,cd} Esegue la corrispondenza di una stringa dall'insieme di stringhe {ab, cd}.
{ab,c{de, fh}} Corrisponde a una stringa dal set di stringhe {ab, cde, cfh}.

read_files usa il globber rigido di Auto Loader durante l'individuazione dei file tramite i globs. Questa opzione è configurata dall'opzione useStrictGlobber . Quando il globber rigido è disabilitato, le barre finali (/) vengono eliminate e un motivo a stella, /*/ ad esempio, può espandersi per individuare più directory. Vedere gli esempi seguenti per vedere la differenza nel comportamento.

Modello Percorso del file Globber rigido disabilitato Strict globber abilitato
/a/b /a/b/c/file.txt
/a/b /a/b_dir/c/file.txt No No
/a/b /a/b.txt No No
/a/b/ /a/b.txt No No
/a/*/c/ /a/b/c/file.txt
/a/*/c/ /a/b/c/d/file.txt
/a/*/d/ /a/b/c/d/file.txt No
/a/*/c/ /a/b/x/y/c/file.txt No
/a/*/c /a/b/c_file.txt No
/a/*/c/ /a/b/c_file.txt No
/a/*/c /a/b/cookie/file.txt No
/a/b* /a/b.txt
/a/b* /a/b/file.txt
/a/{0.txt,1.txt} /a/0.txt
/a/*/{0.txt,1.txt} /a/0.txt No No
/a/b/[cde-h]/i/ /a/b/c/i/file.txt

Inferenza dello schema

Lo schema dei file può essere fornito in modo esplicito a read_files con l'opzione schema . Quando lo schema non viene specificato, read_files tenta di dedurre uno schema unificato tra i file individuati, che richiede la lettura di tutti i file, a meno che non venga usata un'istruzione LIMIT . Anche quando si usa una LIMIT query, potrebbe essere letto un set di file di dimensioni maggiori di quello necessario per restituire uno schema più rappresentativo dei dati. Databricks aggiunge automaticamente un'istruzione LIMIT alle query eseguite nei notebook e nell'editor SQL se l'utente non ne ha fornita una.

L'opzione schemaHints può essere usata per correggere i subset dello schema dedotto. Vedere Oltrepassare l'inferenza dello schema con suggerimenti di schema per ulteriori dettagli.

Un rescuedDataColumn oggetto viene fornito per impostazione predefinita per salvare tutti i dati che non corrispondono allo schema. Per altri dettagli, vedere Che cos'è la colonna di dati salvata? È possibile eliminare rescuedDataColumn impostando l'opzione schemaEvolutionMode => 'none'.

Inferenza dello schema di partizione

può anche dedurre le colonne di partizionamento se i file sono archiviati in directory partizionate in stile Hive , cioè . Se un schema viene specificato, le colonne di partizione individuate utilizzano i tipi forniti in schema. Se le colonne di partizione non fanno parte dell'oggetto specificato schema, le colonne di partizione dedotte vengono ignorate.

Se esiste una colonna sia nello schema di partizione che nelle colonne di dati, viene usato il valore letto dal valore della partizione anziché il valore di dati. Se si desidera ignorare i valori provenienti dalla directory e usare la colonna di dati, è possibile fornire l'elenco di colonne di partizione in un elenco delimitato da virgole con l'opzione partitionColumns .

L'opzione partitionColumns può essere usata anche per indicare read_files sulle colonne individuate da includere nello schema dedotto finale. Se si specifica una stringa vuota, tutte le colonne di partizione vengono ignorate.

È possibile specificare anche l'opzione schemaHints per sovrascrivere lo schema dedotto per una colonna di partizione.

I TEXT formati e BINARYFILE hanno uno schema fisso, ma read_files tenta anche di dedurre il partizionamento per questi formati, quando possibile.

Autenticazione per l'archiviazione cloud

read_files legge i file dai percorsi esterni del catalogo Unity o dai volumi del catalogo Unity (gestiti ed esterni). È necessario avere il READ FILES privilegio per il percorso esterno o il READ VOLUME privilegio per il volume che contiene i file da leggere. Vedere Connettersi all'archiviazione di oggetti cloud usando il catalogo Unity o Che cosa sono i volumi del catalogo Unity?.

Utilizzo nelle tabelle di streaming

read_files può essere usato nelle tabelle di streaming per inserire file in Delta Lake. read_files utilizza Auto Loader in modo efficace quando viene impiegato in una query di una tabella di streaming. È necessario usare la STREAM parola chiave con read_files. Per altri dettagli, vedere Che cos'è il caricatore automatico?

Se usato in una query di streaming, read_files usa un esempio di dati per dedurre lo schema e può evolvere lo schema man mano che elabora più dati. Per altri dettagli, vedere Configurare l'inferenza e l'evoluzione dello schema in Caricamento automatico.

Opzioni

Opzioni standard

Opzione
format
Tipo: String
Formato del file di dati nel percorso di origine. Dedotto automaticamente se non specificato. I valori consentiti includono:

Valore predefinito: Nessuno
schema
Tipo: String
Schema dei file da leggere. Specificare una stringa di schema usando il formato DDL, ad esempio 'id int, ts timestamp, event string'. Quando lo schema non viene specificato, read_files tenta di dedurre uno schema unificato tra i file individuati.
Valore predefinito: Nessuno
inferColumnTypes
Tipo: Boolean
Stabilisce se dedurre tipologie esatte di colonna quando si sfrutta l'inferenza dello schema. Per impostazione predefinita, le colonne vengono dedotte durante l'inferenza di set di dati JSON e CSV. Per altri dettagli, vedere Inferenza dello schema. Si noti che questo è l'opposto dell'impostazione predefinita di Auto Loader.
Valore predefinito: true
partitionColumns
Tipo: String
Elenco delimitato da virgole di colonne di partizione di stile Hive che si desidera dedurre dalla struttura di directory dei file. Le colonne di partizione dello stile Hive sono coppie chiave-valore combinate da un segno di uguaglianza, ad esempio
<base-path>/a=x/b=1/c=y/file.format. In questo esempio le colonne di partizione sono a, b e c. Per impostazione predefinita, queste colonne verranno aggiunte automaticamente allo schema se si utilizza l'inferenza dello schema, fornendo il <base-path> da cui caricare i dati. Se si specifica uno schema, il caricatore automatico prevede che queste colonne vengano incluse nello schema. Se non si desidera che queste colonne facciano parte dello schema, è possibile specificare "" per ignorare queste colonne. Inoltre, è possibile usare questa opzione quando si vuole dedurre il percorso del file in strutture di directory complesse, come nell'esempio seguente:
<base-path>/year=2022/week=1/file1.csv
<base-path>/year=2022/month=2/day=3/file2.csv
<base-path>/year=2022/month=2/day=4/file3.csv
Specificando cloudFiles.partitionColumns come year,month,day, questo restituirà
year=2022 per file1.csv, ma le colonne month e day saranno null.
month e day verranno analizzati correttamente per file2.csv e file3.csv.
Valore predefinito: Nessuno
schemaHints
Tipo: String
Informazioni sullo schema fornite ad Auto Loader durante l'inferenza dello schema. Vedere hint di schema per maggiori dettagli.
Valore predefinito: Nessuno
useStrictGlobber
Tipo: Boolean
Indica se usare un globber rigoroso che si allinei con il comportamento globbing predefinito di altre risorse di file in Apache Spark. Per altri dettagli, vedere Modelli di caricamento dei dati comuni. Disponibile in Databricks Runtime 12.2 LTS e versioni successive. Si noti che si tratta dell'opposto dell'impostazione predefinita per Il caricatore automatico.
Valore predefinito: true

Opzioni specifiche del formato

Per le opzioni specifiche per ogni formato di file (JSON, CSV, XML, Parquet, Avro, text, ORC e binary), vedere Opzioni DataFrameReader.

Opzioni di streaming

Queste opzioni si applicano quando si usa read_files all'interno di una tabella di streaming o di una query di streaming.

Opzione
allowOverwrites
Tipo: Boolean
Se rielaborare i file modificati dopo l'individuazione. L'ultima versione disponibile del file verrà elaborata durante un aggiornamento se è stata modificata dopo l'ora di inizio dell'ultima query di aggiornamento completata.
Valore predefinito: false
includeExistingFiles
Tipo: Boolean
Indica se includere file esistenti nel percorso di input di elaborazione del flusso o elaborare solo i nuovi file in arrivo dopo l'installazione iniziale. Questa opzione viene valutata solo quando si avvia uno streaming per la prima volta. La modifica di questa opzione dopo il riavvio del flusso non ha alcun effetto.
Valore predefinito: true
maxBytesPerTrigger
Tipo: Byte String
Numero massimo di nuovi byte da elaborare in ogni trigger. È possibile specificare una stringa di byte, ad esempio 10g per limitare ogni microbatch a 10 GB di dati. Questo è un massimo morbido. Se sono presenti file di 3 GB ciascuno, Azure Databricks elabora 12 GB in un microbatch. Se usato insieme a maxFilesPerTrigger, Azure Databricks utilizza fino al limite inferiore di maxFilesPerTrigger o maxBytesPerTrigger, a qualsiasi valore raggiunto per primo.
Nota: Per le tabelle di streaming create su SQL Warehouses serverless, questa opzione e maxFilesPerTrigger non devono essere impostati per sfruttare il controllo dinamico dell'ammissione, che si adatta in base alle dimensioni del carico di lavoro e alle risorse di calcolo serverless per garantire la migliore latenza e prestazioni.
Valore predefinito: Nessuno
maxFilesPerTrigger
Tipo: Integer
Numero massimo di nuovi file da elaborare in ogni trigger. Se usato insieme a maxBytesPerTrigger, Azure Databricks utilizza fino al limite inferiore di maxFilesPerTrigger o maxBytesPerTrigger, a qualsiasi valore raggiunto per primo.
Nota: Per le tabelle di streaming create su SQL Warehouses serverless, questa opzione e maxBytesPerTrigger non devono essere impostati per sfruttare il controllo dinamico dell'ammissione, che si adatta in base alle dimensioni del carico di lavoro e alle risorse di calcolo serverless per garantire la migliore latenza e prestazioni.
Valore predefinito: 1000
schemaEvolutionMode
Tipo: String
La modalità per l'evoluzione dello schema man mano che vengono individuate nuove colonne nei dati. Per impostazione predefinita, le colonne vengono dedotte come stringhe durante l'inferenza di set di dati JSON. Per altri dettagli, vedere Evoluzione dello schema. Questa opzione non si applica ai text file e binaryFile .
Valore predefinito: "addNewColumns" quando non viene fornito uno schema.
In caso contrario, "none".
schemaLocation
Tipo: String
Posizione dove memorizzare lo schema dedotto e le modifiche successive. Per altri dettagli, vedere Inferenza dello schema. Il percorso dello schema non è necessario se usato in una query di tabella di streaming.
Valore predefinito: Nessuno

Esempi

-- Reads the files available in the given path. Auto-detects the format and schema of the data.
> SELECT * FROM read_files('abfss://container@storageAccount.dfs.core.windows.net/base/path');

-- Reads the headerless CSV files in the given path with the provided schema.
> SELECT * FROM read_files(
    's3://bucket/path',
    format => 'csv',
    schema => 'id int, ts timestamp, event string');

-- Infers the schema of CSV files with headers. Because the schema is not provided,
-- the CSV files are assumed to have headers.
> SELECT * FROM read_files(
    's3://bucket/path',
    format => 'csv')

-- Reads files that have a csv suffix.
> SELECT * FROM read_files('s3://bucket/path/*.csv')

-- Reads a single JSON file
> SELECT * FROM read_files(
    'abfss://container@storageAccount.dfs.core.windows.net/path/single.json')

-- Reads JSON files and overrides the data type of the column `id` to integer.
> SELECT * FROM read_files(
    's3://bucket/path',
    format => 'json',
    schemaHints => 'id int')

-- Reads files that have been uploaded or modified yesterday.
> SELECT * FROM read_files(
    'gs://my-bucket/avroData',
    modifiedAfter => date_sub(current_date(), 1),
    modifiedBefore => current_date())

-- Creates a Delta table and stores the source file path as part of the data
> CREATE TABLE my_avro_data
  AS SELECT *, _metadata.file_path
  FROM read_files('gs://my-bucket/avroData')

-- Creates a streaming table that processes files that appear only after the table's creation.
-- The table will most likely be empty (if there's no clock skew) after being first created,
-- and future refreshes will bring new data in.
> CREATE OR REFRESH STREAMING TABLE avro_data
  AS SELECT * FROM STREAM read_files('gs://my-bucket/avroData', includeExistingFiles => false);

Usare file non strutturati

Gli esempi seguenti usano il BINARYFILE formato per leggere e filtrare i file non strutturati archiviati nei volumi del catalogo Unity e combinarli read_files con le funzioni di intelligenza artificiale per elaborare il contenuto dei file.

Elencare tutti i file in un volume: usare * EXCEPT (content) per restituire i metadati dei file senza caricare il contenuto binario e selezionare _metadata in modo esplicito per includere campi di metadati a livello di file.

SELECT
  * EXCEPT (content),
  _metadata
FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>',
  format => 'binaryFile'
);

Elencare i file di immagine filtrati in base alle dimensioni: usare fileNamePattern per impostare come destinazione tipi di file di immagine specifici e filtrare in modo _metadata.file_size da restituire solo i file all'interno di un intervallo di dimensioni specificato.

SELECT
  * EXCEPT (content),
  _metadata
FROM read_files(
  '/Volumes/my_catalog/my_schema/my_volume',
  format => 'binaryFile',
  fileNamePattern => '*.{jpg,jpeg,png,JPG,JPEG,PNG}'
)
WHERE _metadata.file_size BETWEEN 20000 AND 1000000;

Elencare i file PDF modificati nell'ultimo giorno: usare fileNamePattern per impostare come destinazione i file PDF e filtrare in modo da modificationTime restituire solo i file modificati nell'ultimo giorno.

SELECT
  * EXCEPT (content),
  _metadata
FROM read_files(
  '/Volumes/my_catalog/my_schema/my_volume',
  format => 'binaryFile',
  fileNamePattern => '*.{pdf,PDF}'
)
WHERE modificationTime >= current_timestamp() - INTERVAL 1 DAY;

Eseguire una funzione di intelligenza artificiale nei file di immagine: usare ai_query per elaborare i file di immagine letti da un percorso di archiviazione cloud. Filtrare in base ai _metadata campi per specificare i file di destinazione.

SELECT
  path AS file_path,
  ai_query(
    'databricks-llama-4-maverick',
    'Describe this image in ten words or less: ',
    files => content
  ) AS result
FROM read_files(
  's3://my-s3-bucket/path/to/images/',
  format => 'binaryFile',
  fileNamePattern => '*.{jpg,jpeg,png,JPG,JPEG,PNG}'
)
WHERE _metadata.file_size < 1000000
  AND _metadata.file_name LIKE '%robots%';

Analizzare i documenti corrispondenti a un modello di nome file: usare ai_parse_document per estrarre contenuto strutturato da PDF e immagini. Filtra in base _metadata.file_name a per specificare i file specifici.

SELECT
  path AS file_path,
  ai_parse_document(
    content,
    map('version', '2.0')
  ) AS result
FROM read_files(
  '/Volumes/main/public/my_files/',
  format => 'binaryFile',
  fileNamePattern => '*.{jpg,jpeg,pdf,png}'
)
WHERE _metadata.file_name ILIKE '%receipt%';

Unire file con una tabella strutturata: i flussi di lavoro non strutturati spesso richiedono l'unione di dati strutturati archiviati in tabelle con file non strutturati. L'esempio seguente unisce i file in un percorso di archiviazione cloud con due tabelle strutturate, filtrando in base alle dimensioni del file e a un attributo utente. Il join con user_files viene eseguito estraendo l'ID file dal percorso del file usando split e element_at.

SELECT
  users.user_id,
  user_files.file_id,
  files._metadata.file_name AS file_name,
  files.* EXCEPT (content),
  ai_parse_document(files.content, map('version', '2.0')) AS parsed_document
FROM read_files(
  's3://my-bucket-name/files/',
  format => 'binaryFile',
  fileNamePattern => '*.{pdf,doc,docx,ppt,pptx,png,jpg,jpeg}'
) AS files
JOIN user_files
  ON user_files.file_id = element_at(split(files.path, '/'), -2)
JOIN users
  ON users.user_id = user_files.user_id
WHERE users.email LIKE '%@databricks.com'
  AND files._metadata.file_size < 10000000;