Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här sidan visar hur du lagrar, frågar och bearbetar ostrukturerade datafiler med hjälp av Unity Catalog-volymer. Du får lära dig hur du laddar upp filer, frågar efter metadata, bearbetar filer med AI-funktioner, tillämpar åtkomstkontroll och delar volymer med andra organisationer. Där det är möjligt har instruktioner för hur du arbetar med den här självstudien med hjälp av katalogutforskarens användargränssnitt inkluderats. Om inget katalogutforskaren-alternativ visas använder du de angivna Python- eller SQL-kommandona.
En fullständig översikt över volymfunktioner och användningsfall finns i Vad är Unity Catalog-volymer?.
Anmärkning
Denna handledning använder AI-funktioner för att bearbeta filer per väg. Typen, som finns i beta, FILE tillåter dig att lagra filreferenser och metadata som kolumnvärden i en tabell. Se FILTYP och ostrukturerad data.
Kravspecifikation
- En Azure Databricks-arbetsyta med Unity Catalog aktiverad.
-
CREATE CATALOGbehörighet på metaarkivet. Se: Skapa kataloger. Om du inte kan skapa en katalog ber du administratören om åtkomst eller använder en befintlig katalog där du har behörighetenCREATE SCHEMA. - Databricks Runtime 14.3 LTS och senare.
- För AI-funktioner: En arbetsyta i en region som stöds.
- För OpenSharing:
CREATE SHAREochCREATE RECIPIENTbehörigheter i metaarkivet. Se Dela data och AI-tillgångar på ett säkert sätt.
Steg 1: Skapa en volym
Skapa en katalog, ett schema och en volym för att lagra dina filer. Detaljerade instruktioner för volymhantering finns i Skapa och hantera Unity Catalog-volymer.
Steg 1.1: Skapa en katalog och ett schema
SQL
-- Create a catalog
CREATE CATALOG IF NOT EXISTS unstructured_data_lab;
USE CATALOG unstructured_data_lab;
-- Create a schema
CREATE SCHEMA IF NOT EXISTS raw;
USE SCHEMA raw;
python
spark.sql("CREATE CATALOG IF NOT EXISTS unstructured_data_lab")
spark.sql("USE CATALOG unstructured_data_lab")
spark.sql("CREATE SCHEMA IF NOT EXISTS raw")
spark.sql("USE SCHEMA raw")
Katalogutforskaren
- Klicka på
Katalog i sidofältet.
- Klicka på Skapa>skapa en katalog.
- Ange unstructured_data_lab som katalognamn.
- Klicka på Skapa.
- Klicka på Visa katalog.
På katalogsidan:
- Klicka på Skapa schema.
- Ange raw som schemanamn.
- Klicka på Skapa.
Steg 1.2: Skapa en hanterad volym
SQL
CREATE VOLUME IF NOT EXISTS files_volume
COMMENT 'Volume for storing unstructured data files';
python
spark.sql("""
CREATE VOLUME IF NOT EXISTS files_volume
COMMENT 'Volume for storing unstructured data files'
""")
Katalogutforskaren
På schemasidan:
- Klicka på Skapa>Volym.
- Ange files_volume som volymnamn.
- Kontrollera att Hanterad volym har valts.
- Klicka på Skapa.
Steg 2: Ladda upp filer
Ladda upp filer till din volym. Omfattande filhanteringsexempel finns i Arbeta med filer i Unity Catalog-volymer.
Steg 2.1: Ladda upp filer
Du kan använda exempel från databricks-datasets för den här självstudien eller ladda upp dina egna filer med hjälp av katalogutforskarens användargränssnitt.
Anmärkning
Du kan använda Python-kommandon för att kopiera filer från databricks-datasets till volymen även om du inte är bekant med Python. Mer information om hur du kör kommandon i notebook-filer finns i Hantera Databricks-notebook-filer .
python
# Upload a single image file
dbutils.fs.cp(
"dbfs:/databricks-datasets/flower_photos/roses/10090824183_d02c613f10_m.jpg",
"/Volumes/unstructured_data_lab/raw/files_volume/rose.jpg"
)
# Upload a single PDF file
dbutils.fs.cp(
"dbfs:/databricks-datasets/COVID/CORD-19/2020-03-13/COVID.DATA.LIC.AGMT.pdf",
"/Volumes/unstructured_data_lab/raw/files_volume/covid.pdf"
)
# Upload a directory
local_dir = "dbfs:/databricks-datasets/samples/data/mllib"
volume_path = "/Volumes/unstructured_data_lab/raw/files_volume/sample_files"
for file_info in dbutils.fs.ls(local_dir):
source = file_info.path
dest = f"{volume_path}/{file_info.name}"
dbutils.fs.cp(source, dest, recurse=True)
print(f"Uploaded: {file_info.name}")
Katalogutforskaren
Python-koden på fliken Python laddar upp två filer (en JPG och en PDF) och en katalog som innehåller .txt och .csv filer. Så här laddar du upp filer med Hjälp av Catalog Explorer:
- På volymsidan klickar du på Ladda upp till den här volymen.
- I dialogrutan Ladda upp filer under Filer klickar du på Bläddra eller drar och släpper filer till släppzonen.
- Under Målvolym kontrollerar du att den volym som du skapade i föregående steg är markerad.
Steg 2.2: Verifiera uppladdningen
SQL
LIST '/Volumes/unstructured_data_lab/raw/files_volume/';
python
files = dbutils.fs.ls("/Volumes/unstructured_data_lab/raw/files_volume/")
for f in files:
print(f"{f.name}\t{f.size} bytes")
Katalogutforskaren
När filer laddas upp visas de på volymsidan. Klicka på ett filnamn för att se en förhandsgranskning eller klicka på en katalog för att visa enskilda filer.
Alternativ: Använd kommandot %fs magic
Använd det %fs magiska kommandot:
%fs ls /Volumes/unstructured_data_lab/raw/files_volume/
Steg 3: Fråga efter filmetadata
Fråga efter filinformation för att förstå vad som finns i volymen. Fler frågemönster finns i Lista och fråga efter filer i volymer med SQL.
Steg 3.1: Visa filmetadata
SQL
SELECT
path,
_metadata.file_name,
_metadata.file_size,
_metadata.file_modification_time
FROM read_files(
'/Volumes/unstructured_data_lab/raw/files_volume/',
format => 'binaryFile'
);
python
df = (
spark.read
.format("binaryFile")
.option("recursiveFileLookup", "true")
.load("/Volumes/unstructured_data_lab/raw/files_volume/")
)
df.select("path", "modificationTime", "length").show(truncate=False)
Katalogutforskaren
På volymsidan i Katalogutforskaren visas varje fils namn (inklusive tillägget), Storlek och Senast ändrat datum.
Steg 4: Fråga och bearbeta filer
Använd Azure Databricks AI-funktioner för att extrahera innehåll från dokument och analysera bilder. En fullständig översikt över funktionerna i AI finns i Berika data med ai-funktioner.
Anmärkning
AI-funktioner kräver en arbetsyta i en region som stöds. Se Berika data med AI Functions.
Om du inte har åtkomst till AI-funktioner använder du python-standardbibliotek i stället. Expandera de alternativa avsnitten nedan för exempel.
Steg 4.1: Parsa dokument
SQL
SELECT
path AS file_path,
ai_parse_document(content, map('version', '2.0')) AS parsed_content
FROM read_files(
'/Volumes/unstructured_data_lab/raw/files_volume/',
format => 'binaryFile',
fileNamePattern => '*.pdf'
);
python
result_df = spark.sql("""
SELECT
path AS file_path,
ai_parse_document(content, map('version', '2.0')) AS parsed_content
FROM read_files(
'/Volumes/unstructured_data_lab/raw/files_volume/',
format => 'binaryFile',
fileNamePattern => '*.pdf'
)
""")
display(result_df)
Alternativ: Parsa PDF-filer utan AI-funktioner
Om AI-funktioner inte är tillgängliga i din region använder du Python-bibliotek:
%pip install PyPDF2==3.0.1
from pyspark.sql.functions import udf
from pyspark.sql.types import StringType
from PyPDF2 import PdfReader
import io
@udf(returnType=StringType())
def extract_pdf_text(content):
if content is None:
return None
try:
reader = PdfReader(io.BytesIO(content))
return "\n".join(page.extract_text() or "" for page in reader.pages)
except Exception as e:
return f"Error: {str(e)}"
df = spark.read.format("binaryFile") \
.option("pathGlobFilter", "*.pdf") \
.load("/Volumes/unstructured_data_lab/raw/files_volume/")
result_df = df.withColumn("text_content", extract_pdf_text("content"))
display(result_df.select("path", "text_content"))
Steg 4.2: Analysera bilder
SQL
SELECT
path,
ai_query(
'databricks-llama-4-maverick',
'Describe this image in one sentence:',
files => content
) AS description
FROM read_files(
'/Volumes/unstructured_data_lab/raw/files_volume/',
format => 'binaryFile',
fileNamePattern => '*.{jpg,jpeg,png}'
)
WHERE _metadata.file_size < 5000000;
python
result_df = spark.sql("""
SELECT
path,
ai_query(
'databricks-llama-4-maverick',
'Describe this image in one sentence:',
files => content
) AS description
FROM read_files(
'/Volumes/unstructured_data_lab/raw/files_volume/',
format => 'binaryFile',
fileNamePattern => '*.{jpg,jpeg,png}'
)
WHERE _metadata.file_size < 5000000
""")
display(result_df)
Alternativ: Extrahera bildmetadata utan AI-funktioner
Så här extraherar du bildmetadata utan AI-funktioner:
%pip install pillow==10.4.0
from pyspark.sql.functions import udf
from pyspark.sql.types import StructType, StructField, IntegerType, StringType
from PIL import Image
import io
image_schema = StructType([
StructField("width", IntegerType()),
StructField("height", IntegerType()),
StructField("format", StringType())
])
@udf(returnType=image_schema)
def get_image_info(content):
if content is None:
return None
try:
img = Image.open(io.BytesIO(content))
return {"width": img.width, "height": img.height, "format": img.format}
except:
return None
df = spark.read.format("binaryFile") \
.option("pathGlobFilter", "*.{jpg,jpeg,png}") \
.load("/Volumes/unstructured_data_lab/raw/files_volume/")
result_df = df.withColumn("image_info", get_image_info("content"))
display(result_df.select("path", "image_info.*"))
Steg 4.3: Filtrera och analysera efter filnamn
Det här exemplet filtrerar för bildfiler med understrängen "rose" i deras filnamn.
SQL
SELECT
path AS file_path,
ai_query(
'databricks-llama-4-maverick',
'Describe this image in one sentence:',
files => content
) AS description
FROM read_files(
'/Volumes/unstructured_data_lab/raw/files_volume/',
format => 'binaryFile',
fileNamePattern => '*.{jpg,jpeg,png}'
)
WHERE _metadata.file_name ILIKE '%rose%';
python
result_df = spark.sql("""
SELECT
path AS file_path,
ai_query(
'databricks-llama-4-maverick',
'Describe this image in one sentence:',
files => content
) AS description
FROM read_files(
'/Volumes/unstructured_data_lab/raw/files_volume/',
format => 'binaryFile',
fileNamePattern => '*.{jpg,jpeg,png}'
)
WHERE _metadata.file_name ILIKE '%rose%'
""")
display(result_df)
Steg 4.4: Koppla filer med strukturerade tabeller
I det här exemplet används radnummer för att para ihop filer med taxiresor i demonstrationssyfte. I produktion ansluter du till meningsfulla affärsnycklar.
SQL
-- This example demonstrates joining file metadata with structured data
-- by pairing files with taxi trips using row numbers
WITH files_with_row AS (
SELECT
path,
SPLIT(path, '/')[SIZE(SPLIT(path, '/')) - 1] AS file_name,
length,
ROW_NUMBER() OVER (ORDER BY path) AS file_row
FROM read_files(
'/Volumes/unstructured_data_lab/raw/files_volume/',
format => 'binaryFile'
)
),
trips_with_row AS (
SELECT
tpep_pickup_datetime,
pickup_zip,
dropoff_zip,
fare_amount,
ROW_NUMBER() OVER (ORDER BY tpep_pickup_datetime) AS trip_row
FROM samples.nyctaxi.trips
WHERE pickup_zip IS NOT NULL
LIMIT 5
)
SELECT
f.path,
f.file_name,
f.length,
t.pickup_zip,
t.dropoff_zip,
t.fare_amount,
t.tpep_pickup_datetime
FROM files_with_row f
INNER JOIN trips_with_row t ON f.file_row = t.trip_row;
python
from pyspark.sql.functions import col, row_number, element_at, split
from pyspark.sql.window import Window
# Read files and add row numbers
files_df = spark.read.format("binaryFile") \
.load("/Volumes/unstructured_data_lab/raw/files_volume/") \
.withColumn("file_name", element_at(split(col("path"), "/"), -1))
files_with_row = files_df.alias("files") \
.withColumn("file_row", row_number().over(Window.orderBy("path")))
# Get trips and add row numbers
trips_df = spark.table("samples.nyctaxi.trips") \
.filter(col("pickup_zip").isNotNull()) \
.limit(5)
trips_with_row = trips_df.alias("trips") \
.withColumn("trip_row", row_number().over(Window.orderBy("tpep_pickup_datetime")))
# Join on row numbers
result_df = files_with_row \
.join(trips_with_row, col("file_row") == col("trip_row"), "inner") \
.select(
"files.path",
"files.file_name",
"files.length",
"trips.pickup_zip",
"trips.dropoff_zip",
"trips.fare_amount",
"trips.tpep_pickup_datetime"
)
display(result_df)
Steg 5: Tillämpa åtkomstkontroll
Kontrollera vem som kan läsa och skriva filer i dina volymer. Mer information om hur du hanterar privilegier i Unity Catalog finns i Hantera privilegier i Unity Catalog.
Steg 5.1: Bevilja åtkomst
SQL
-- Replace <user-or-group-name> with your workspace group or user name
-- Grant read access
GRANT READ VOLUME ON VOLUME unstructured_data_lab.raw.files_volume
TO `<user-or-group-name>`;
-- Grant read and write access
GRANT READ VOLUME, WRITE VOLUME ON VOLUME unstructured_data_lab.raw.files_volume
TO `<user-or-group-name>`;
-- Grant all privileges
GRANT ALL PRIVILEGES ON VOLUME unstructured_data_lab.raw.files_volume
TO `<user-or-group-name>`;
python
# Replace <user-or-group-name> with your workspace group or user name
spark.sql("""
GRANT READ VOLUME ON VOLUME unstructured_data_lab.raw.files_volume
TO `<user-or-group-name>`
""")
spark.sql("""
GRANT READ VOLUME, WRITE VOLUME ON VOLUME unstructured_data_lab.raw.files_volume
TO `<user-or-group-name>`
""")
spark.sql("""
GRANT ALL PRIVILEGES ON VOLUME unstructured_data_lab.raw.files_volume
TO `<user-or-group-name>`
""")
Katalogutforskaren
- Gå till fliken Behörigheter på volymsidan.
- Klicka på Tillåt.
- Ange e-postadressen för en användare eller namnet på en grupp.
- Välj de behörigheter som ska beviljas.
- Klicka på Bekräfta.
Steg 5.2: Visa aktuella privilegier
SQL
SHOW GRANTS ON VOLUME unstructured_data_lab.raw.files_volume;
python
display(spark.sql("SHOW GRANTS ON VOLUME unstructured_data_lab.raw.files_volume"))
Katalogutforskaren
Fliken Behörigheter på volymsidan visar vilka användare och grupper som har åtkomst till volymen.
Steg 6: Konfigurera inkrementell inmatning
Använd Auto Loader för att automatiskt bearbeta nya filer när de kommer till din volym. Det här mönstret är användbart för arbetsflöden för kontinuerlig datainmatning. Fler inmatningsmönster finns i Vanliga datainläsningsmönster.
Steg 6.1: Skapa en direktuppspelningstabell
SQL
CREATE OR REFRESH STREAMING TABLE document_ingestion
SCHEDULE EVERY 1 HOUR
AS SELECT
path,
modificationTime,
length,
content,
_metadata,
current_timestamp() AS ingestion_time
FROM STREAM(read_files(
'/Volumes/unstructured_data_lab/raw/files_volume/incoming/',
format => 'binaryFile'
));
python
from pyspark.sql.functions import current_timestamp, col
dbutils.fs.mkdirs("/Volumes/unstructured_data_lab/raw/files_volume/incoming/")
df = spark.readStream.format("cloudFiles") \
.option("cloudFiles.format", "binaryFile") \
.option("pathGlobFilter", "*.pdf") \
.load("/Volumes/unstructured_data_lab/raw/files_volume/incoming/")
df_enriched = df \
.withColumn("ingestion_time", current_timestamp()) \
.withColumn("source_file", col("_metadata.file_path"))
query = df_enriched.writeStream \
.option("checkpointLocation",
"/Volumes/unstructured_data_lab/raw/files_volume/_checkpoints/docs") \
.trigger(availableNow=True) \
.toTable("document_ingestion")
query.awaitTermination()
Steg 7: Dela filer med OpenSharing
Dela volymer på ett säkert sätt med användare i andra organisationer som använder OpenSharing. Du måste skapa en mottagare innan du delar den. En mottagare representerar en extern organisation eller användare som kan komma åt dina delade data. Se Skapa datamottagare för OpenSharing (Databricks-till-Databricks-delning) för mottagarkonfiguration.
Steg 7.1: Skapa och konfigurera en delning
SQL
-- Create a share
CREATE SHARE IF NOT EXISTS unstructured_data_share
COMMENT 'Document files for partners';
-- Add the volume
ALTER SHARE unstructured_data_share
ADD VOLUME unstructured_data_lab.raw.files_volume;
-- Create a recipient
CREATE RECIPIENT IF NOT EXISTS <partner_org>
USING ID '<recipient-sharing-identifier>';
-- Grant access
GRANT SELECT ON SHARE unstructured_data_share
TO RECIPIENT <partner_org>;
python
spark.sql("""
CREATE SHARE IF NOT EXISTS unstructured_data_share
COMMENT 'Document files for partners'
""")
spark.sql("""
ALTER SHARE unstructured_data_share
ADD VOLUME unstructured_data_lab.raw.files_volume
""")
spark.sql("""
CREATE RECIPIENT IF NOT EXISTS <partner_org>
USING ID '<recipient-sharing-identifier>'
""")
spark.sql("""
GRANT SELECT ON SHARE unstructured_data_share
TO RECIPIENT <partner_org>
""")
Steg 7.2: Åtkomst till delade data (som mottagare)
SQL
-- View available shares
SHOW SHARES IN PROVIDER <provider_name>;
-- Create a catalog from the share
CREATE CATALOG IF NOT EXISTS shared_documents
FROM SHARE <provider_name>.unstructured_data_share;
-- Query shared files
SELECT * EXCEPT (content), _metadata
FROM read_files(
'/Volumes/shared_documents/raw/files_volume/',
format => 'binaryFile'
)
LIMIT 10;
python
spark.sql("SHOW SHARES IN PROVIDER <provider_name>").show()
spark.sql("""
CREATE CATALOG IF NOT EXISTS shared_documents
FROM SHARE <provider_name>.unstructured_data_share
""")
df = spark.read.format("binaryFile") \
.load("/Volumes/shared_documents/raw/files_volume/")
df.select("path", "modificationTime", "length").show(10)
Steg 8: Rensa filer
Ta bort filer när de inte längre behövs.
python
# Delete a single file
dbutils.fs.rm("/Volumes/unstructured_data_lab/raw/files_volume/covid.pdf")
# Delete a directory recursively
dbutils.fs.rm("/Volumes/unstructured_data_lab/raw/files_volume/sample_files/", recurse=True)
CLI
# Delete a single file
databricks fs rm dbfs:/Volumes/unstructured_data_lab/raw/files_volume/covid.pdf
# Delete a directory recursively
databricks fs rm -r dbfs:/Volumes/unstructured_data_lab/raw/files_volume/sample_files/
Alternativ: Använd Standard Python
import os
os.remove("/Volumes/unstructured_data_lab/raw/files_volume/covid.pdf")
import shutil
shutil.rmtree("/Volumes/unstructured_data_lab/raw/files_volume/sample_files/")
Ytterligare resurser
Fortsätt lära dig om volymer
- Vad är Unity Catalog-volymer?
- Arbeta med filer i Unity Catalog-volymer
- Skapa och hantera Unity Catalog-volymer
Utforska relaterade funktioner
- Innehållssökning för Unity-katalogvolymer
- Berika data med AI Functions
- Vanliga datainläsningsmönster
- Dela data och AI-tillgångar på ett säkert sätt