read_files tabellvärdesfunktion

Gäller för:markerad ja Databricks SQL markerad ja Databricks Runtime 13.3 LTS och senare

Läser filer under en angivet plats och returnerar data i tabellformat.

Stöder läsning JSON, CSV, XML, TEXT, BINARYFILE, PARQUET, AVROoch ORC filformat. Kan identifiera filformatet automatiskt och härleda ett enhetligt schema för alla filer.

Syntax

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

Argument

Den här funktionen kräver namngivna parameteranrop för alternativnycklarna.

  • path: A STRING med URI för platsen för data. Stöder läsning från Azure Data Lake Storage ('abfss://'), S3 (s3://) och Google Cloud Storage ('gs://'). Kan innehålla globmönster. Se Filsökning för mer information.
  • option_key: Namnet på alternativet som ska konfigureras. Du måste använda backticks () for options that contain dots (`).
  • option_value: Ett konstant uttryck som alternativet ska anges till. Accepterar literaler och skalärfunktioner.

Returer

En tabell som innehåller data från filer som lästs under den angivna path. Schemat beror på filformatet:

  • BINARYFILE: Returnerar ett fast schema:

    Kolumn Type beskrivning
    path STRING Hela sökvägen till filen.
    modificationTime TIMESTAMP Den senaste ändringstiden för filen.
    length LONG Storleken på filen i byte.
    content BINARY Filens binära innehåll. Använd * EXCEPT (content) för att exkludera binärt innehåll när du frågar efter filmetadata.
  • TEXT: Returnerar ett fast schema med en enda value kolumn (STRING).

  • Alla andra format (JSON, CSV, XML, PARQUET, AVRO, ORC): Schemat härleds från filinnehållet eller tillhandahålls uttryckligen schema med hjälp av alternativet.

_metadata Kolumn

read_files exponerar en _metadata kolumn med metadata på filnivå. Den här kolumnen ingår inte i SELECT * resultaten och måste uttryckligen väljas. Det innehåller följande fält:

Fält Type beskrivning
file_path STRING Den fullständiga sökvägen till källfilen.
file_name STRING Namnet på källfilen.
file_size LONG Storleken på källfilen i byte.
file_modification_time TIMESTAMP Den senaste ändringstiden för källfilen.
file_block_start LONG Början av blocket för filen som läss.
file_block_length LONG Längden på blocket för filen som läse.

Om du vill inkludera _metadata i resultat väljer du det explicit:

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

Filsökning

read_files kan läsa en enskild fil eller läsa filer under en angivet katalog. read_files identifierar alla filer under den angivna katalogen rekursivt om inte en glob tillhandahålls, vilket instruerar read_files att upprepas i ett specifikt katalogmönster.

Filtrera kataloger eller filer med hjälp av globmönster

Globmönster kan användas för att filtrera kataloger och filer när de anges i sökvägen.

Mönster beskrivning
? Matchar ett enskilt tecken
* Matchar noll eller fler tecken
[abc] Matchar ett enskilt tecken från teckenuppsättningen {a,b,c}.
[a-z] Matchar ett enskilt tecken från teckenområdet {a... z}.
[^a] Matchar ett enskilt tecken som inte kommer från teckenuppsättningen eller intervallet {a}. Observera att ^-tecknet måste placeras omedelbart till höger om den öppnande hakparentesen.
{ab,cd} Matchar en sträng från stränguppsättningen {ab, cd}.
{ab,c{de, fh}} Matchar en sträng från stränguppsättningen {ab, cde, cfh}.

read_files använder Auto Loaders strikta globmönster när det upptäcker filer med globs. Detta konfigureras med alternativet useStrictGlobber . När den strikta globbern är inaktiverad tas avslutande snedstreck (/) bort, och ett stjärnmönster som /*/ kan utvidgas till att upptäcka flera kataloger. Se exemplen nedan för att se skillnaden i beteende.

Mönster Filväg Strikt globber avaktiverad Strikt globmönster aktiverat
/a/b /a/b/c/file.txt Ja Ja
/a/b /a/b_dir/c/file.txt Nej Nej
/a/b /a/b.txt Nej Nej
/a/b/ /a/b.txt Nej Nej
/a/*/c/ /a/b/c/file.txt Ja Ja
/a/*/c/ /a/b/c/d/file.txt Ja Ja
/a/*/d/ /a/b/c/d/file.txt Ja Nej
/a/*/c/ /a/b/x/y/c/file.txt Ja Nej
/a/*/c /a/b/c_file.txt Ja Nej
/a/*/c/ /a/b/c_file.txt Ja Nej
/a/*/c /a/b/cookie/file.txt Ja Nej
/a/b* /a/b.txt Ja Ja
/a/b* /a/b/file.txt Ja Ja
/a/{0.txt,1.txt} /a/0.txt Ja Ja
/a/*/{0.txt,1.txt} /a/0.txt Nej Nej
/a/b/[cde-h]/i/ /a/b/c/i/file.txt Ja Ja

Schemahärledning

Schemat för filerna kan uttryckligen anges till read_files med alternativet schema. När schemat inte har angetts read_files försöker du härleda ett enhetligt schema över de identifierade filerna, vilket kräver att alla filer läss om inte en LIMIT instruktion används. Även när du använder en LIMIT fråga kan en större uppsättning filer än vad som krävs läsas för att returnera ett mer representativt schema för data. Databricks lägger automatiskt till ett LIMIT-uttalande för SELECT-frågor i notebooks och SQL-redigeraren om en användare inte har angett något.

Alternativet schemaHints kan användas för att åtgärda delmängder av det härledda schemat. Mer information finns i Åsidosätta schemainferens med schematips.

A rescuedDataColumn tillhandahålls som standard för att rädda data som inte matchar schemat. Mer information finns i Vad är den räddade datakolumnen? Du kan släppa rescuedDataColumn alternativet genom att ange .schemaEvolutionMode => 'none'

Slutsatsdragning av partitionsschema

read_files kan också härleda partitioneringskolumner om filer lagras under Partitionerade kataloger i Hive-stil, dvs /column_name=column_value/. Om en schema anges använder de identifierade partitionskolumnerna de typer som anges i schema. Om partitionskolumnerna inte ingår i angivna schemaignoreras de härledda partitionskolumnerna.

Om det finns en kolumn i både partitionsschemat och i datakolumnerna används värdet som läses från partitionsschemat i stället för datavärdet. Om du vill ignorera de värden som kommer från katalogen och använda datakolumnen kan du ange listan med partitionskolumner i en kommaavgränsad lista med alternativet partitionColumns .

Alternativet partitionColumns kan också användas för att instruera om read_files vilka identifierade kolumner som ska inkluderas i det slutliga härledda schemat. Om du anger en tom sträng ignoreras alla partitionskolumner.

Alternativet schemaHints kan också anges för att åsidosätta det härledda schemat för en partitionskolumn.

Formaten TEXT och BINARYFILE har ett fast schema, men read_files försöker också härleda partitionering för dessa format när det är möjligt.

Autentisering för molnlagring

read_files läser filer från externa platser i Unity Catalog eller Unity Catalog-volymer (både hanterade och externa). Du måste ha behörigheten READ FILES på den externa platsen eller behörigheten READ VOLUME på volymen som innehåller de filer som du vill läsa. Se Ansluta till molnobjektlagring med Unity Catalog eller Vad är Unity Catalog-volymer?.

Användning i strömmande tabeller

read_files kan användas i strömmande tabeller för att mata in filer i Delta Lake. read_files utnyttjar Auto Loader när den används i en strömmande tabellfråga. Du måste använda nyckelordet STREAM med read_files. Se Vad är automatisk inläsning? för mer information.

När det används i en direktuppspelningsfråga, använder read_files ett urval av data för att härleda schemat och kan utveckla schemat när det bearbetar mer data. Mer information finns i Konfigurera schemainferens och utveckling i Auto Loader .

Alternativ

Grundläggande alternativ

Alternativ
format
Typ: String
Datafilens format i källsökvägen. Härleds automatiskt om det inte anges. Tillåtna värden är:

Standardvärde: Ingen
schema
Typ: String
Schemat för de filer som ska läsas. Ange en schemasträng med DDL-format, till exempel 'id int, ts timestamp, event string'. När schemat inte har angetts read_files försöker du härleda ett enhetligt schema över de identifierade filerna.
Standardvärde: Ingen
inferColumnTypes
Typ: Boolean
Om du vill härleda exakta kolumntyper vid användning av schemainferens. Som standard härleds kolumner när JSON- och CSV-datauppsättningar härleds. Mer information finns i schemainferens . Observera att detta är motsatsen till standardinställningen för Auto-laddare.
Standardvärde: true
partitionColumns
Typ: String
En kommaavgränsad lista över Partitionskolumner i Hive-format som du vill härleda från filernas katalogstruktur. Partitionskolumner i Hive-format är nyckel/värde-par som kombineras med ett likhetstecken, till exempel
<base-path>/a=x/b=1/c=y/file.format. I det här exemplet är partitionskolumnerna a, b och c. Som standard läggs dessa kolumner automatiskt till i schemat om du använder schemainferens och anger att <base-path> data ska läsas in från. Om du anger ett schema förväntar sig Auto Loader att dessa kolumner inkluderas i schemat. Om du inte vill att dessa kolumner ska ingå i schemat kan du ange "" att dessa kolumner ska ignoreras. Dessutom kan du använda det här alternativet när du vill att kolumner ska härledas till filsökvägen i komplexa katalogstrukturer, som exemplet nedan:
<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
Genom att ange cloudFiles.partitionColumns som year,month,day kommer det att returneras
year=2022 för file1.csv, men kolumnerna month och day blir null.
month och day parsas korrekt för file2.csv och file3.csv.
Standardvärde: Ingen
schemaHints
Typ: String
Schemainformation som du anger för Auto Loader vid schemainferens. Mer information finns i schematips .
Standardvärde: Ingen
useStrictGlobber
Typ: Boolean
Huruvida man ska använda en strikt globber som matchar standardglobbingbeteendet för andra filkällor i Apache Spark. Mer information finns i Vanliga datainläsningsmönster . Finns i Databricks Runtime 12.2 LTS och senare. Observera att detta är motsatsen till standardvärdet för automatisk inläsning.
Standardvärde: true

Formatspecifika alternativ

Alternativ som är specifika för varje filformat (JSON, CSV, XML, Parquet, Avro, text, ORC och binär fil) finns i DataFrameReader-alternativ.

Alternativ för direktuppspelning

De här alternativen gäller när du använder read_files i en direktuppspelningstabell eller en direktuppspelningsfråga.

Alternativ
allowOverwrites
Typ: Boolean
Om filer som har ändrats efter identifieringen ska bearbetas igen. Den senaste tillgängliga versionen av filen bearbetas under en uppdatering om den har ändrats sedan den senaste lyckade uppdateringsfrågans starttid.
Standardvärde: false
includeExistingFiles
Typ: Boolean
Om du vill inkludera befintliga filer i indatasökvägen för dataströmbearbetning eller endast bearbeta nya filer som kommer efter den första installationen. Det här alternativet utvärderas endast när du startar en dataström för första gången. Att ändra det här alternativet efter att strömmen har startats om har ingen effekt.
Standardvärde: true
maxBytesPerTrigger
Typ: Byte String
Det maximala antalet nya byte som ska bearbetas i varje utlösare. Du kan ange en bytesträng, till exempel 10g för att begränsa varje mikrobatch till 10 GB data. Detta är ett mjukt maxvärde. Om du har filer som är 3 GB vardera Azure Databricks bearbetar 12 GB i en mikrobatch. När den används tillsammans med maxFilesPerTrigger förbrukar Azure Databricks upp till den lägre gränsen på maxFilesPerTrigger eller maxBytesPerTrigger, beroende på vilket som uppnås först.
Obs! För strömmande tabeller som skapats på serverlösa SQL-lager bör det här alternativet och maxFilesPerTrigger inte ställas in för att utnyttja dynamisk antagningskontroll, som skalar efter arbetsbelastningsstorlek och serverlösa beräkningsresurser för att ge dig bästa svarstid och prestanda.
Standardvärde: Ingen
maxFilesPerTrigger
Typ: Integer
Det maximala antalet nya filer som ska bearbetas i varje utlösare. När den används tillsammans med maxBytesPerTrigger förbrukar Azure Databricks upp till den lägre gränsen på maxFilesPerTrigger eller maxBytesPerTrigger, beroende på vilket som uppnås först.
Obs! För strömmande tabeller som skapats på serverlösa SQL-lager bör det här alternativet och maxBytesPerTrigger inte ställas in för att utnyttja dynamisk antagningskontroll, som skalar efter arbetsbelastningsstorlek och serverlösa beräkningsresurser för att ge dig bästa svarstid och prestanda.
Standardvärde: 1 000
schemaEvolutionMode
Typ: String
Sättet att utveckla schemat när nya kolumner upptäcks i data. Som standard härleds kolumner som strängar när JSON-datauppsättningar härleds. Mer information finns i schemautveckling . Det här alternativet gäller inte för text filer och binaryFile filer.
Standardvärde: "addNewColumns" när ett schema inte har angetts.
"none" annars.
schemaLocation
Typ: String
Platsen där du vill lagra det härledda schemat och efterföljande ändringar. Mer information finns i schemainferens . Schemaplatsen krävs inte när den används i en strömningstabellfråga.
Standardvärde: Ingen

Exempel

-- 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);

Arbeta med ostrukturerade filer

I följande exempel används BINARYFILE format för att läsa och filtrera ostrukturerade filer som lagras i Unity Catalog-volymer och kombinera read_files med AI-funktioner för att bearbeta filinnehåll.

Visa en lista över alla filer i en volym: Använd * EXCEPT (content) för att returnera filmetadata utan att läsa in binärt innehåll och välj _metadata uttryckligen att inkludera metadatafält på filnivå.

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

Lista bildfiler filtrerade efter storlek: Använd fileNamePattern för att rikta in specifika bildfiltyper och filtrera på _metadata.file_size för att endast returnera filer inom ett angivet storleksintervall.

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;

Lista PDF-filer som ändrats under den senaste dagen: Använd fileNamePattern för att rikta PDF-filer och filtrera på modificationTime för att endast returnera filer som ändrats under den senaste dagen.

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;

Kör en AI-funktion på bildfiler: Använd ai_query för att bearbeta bildfiler som lästs från en molnlagringssökväg. Filtrera på _metadata fält för att rikta in specifika filer.

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%';

Parsa dokument som matchar ett filnamnsmönster: Använd ai_parse_document för att extrahera strukturerat innehåll från PDF-filer och bilder. _metadata.file_name Filtrera efter för att rikta in specifika filer.

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%';

Koppla filer med en strukturerad tabell: Ostrukturerade arbetsflöden kräver ofta sammanslagning av strukturerade data som lagras i tabeller med ostrukturerade filer. I följande exempel kopplas filer till en molnlagringssökväg med två strukturerade tabeller, filtrering efter filstorlek och ett användarattribut. Kopplingen med user_files görs genom att extrahera fil-ID:t från filsökvägen med hjälp av split och 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;