Arbeta med ostrukturerade data i volymer

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 CATALOG behö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örigheten CREATE SCHEMA .
  • Databricks Runtime 14.3 LTS och senare.
  • För AI-funktioner: En arbetsyta i en region som stöds.
  • För OpenSharing: CREATE SHARE och CREATE RECIPIENT behö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

  1. Klicka på dataikonen.Katalog i sidofältet.
  2. Klicka på Skapa>skapa en katalog.
  3. Ange unstructured_data_lab som katalognamn.
  4. Klicka på Skapa.
  5. Klicka på Visa katalog.

På katalogsidan:

  1. Klicka på Skapa schema.
  2. Ange raw som schemanamn.
  3. 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:

  1. Klicka på Skapa>Volym.
  2. Ange files_volume som volymnamn.
  3. Kontrollera att Hanterad volym har valts.
  4. 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:

  1. På volymsidan klickar du på Ladda upp till den här volymen.
  2. I dialogrutan Ladda upp filer under Filer klickar du på Bläddra eller drar och släpper filer till släppzonen.
  3. 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

  1. Gå till fliken Behörigheter på volymsidan.
  2. Klicka på Tillåt.
  3. Ange e-postadressen för en användare eller namnet på en grupp.
  4. Välj de behörigheter som ska beviljas.
  5. 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

SQL-funktionsreferenser