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.
Viktigt!
Databricks rekommenderar att du använder datakällan binär fil för att läsa in bilddata i en Spark-DataFrame som råa byte. Se Referenslösning för bildprogram för det rekommenderade arbetsflödet för att hantera bilddata.
Bilddatakällan tillhandahåller ett standard-API för att läsa in bildfiler i Spark DataFrames som en avkodad struct, vilket ger dig direkt åtkomst till bildmetadata som höjd, bredd, kanalantal och rådata för bildpunkter. Det används främst i förbearbetningspipelines för maskininlärning där strukturerade bildfält krävs tillsammans med pixeldata. Azure Databricks stöder batchläsning från bilddatakällor, inklusive upptäckt av partitioner för organiserade bildkataloger. Om du vill läsa avbildningsfiler anger du datakällan format som image.
Förutsättningar
Azure Databricks kräver inte ytterligare konfiguration för att använda avbildningsdatakällan.
Options
.option() Använd metoderna .options() och DataFrameReader för att konfigurera bilddatakällan. En fullständig lista över alternativ som stöds finns i Referens för Spark API-alternativ.
Usage
I följande exempel visas hur du läser in bildfiler med Hjälp av Spark DataFrame-API:et, väljer bildmetadatafält, visar miniatyrbilder och sparar avkodade bilddata i en Delta-tabell.
Läs bildfiler
Använd Apache Spark DataFrame API för att läsa in avbildningsfiler till en DataFrame. Du kan importera en kapslad katalogstruktur genom att ange en katalogsökväg och använda partitionsidentifiering genom att ange en sökväg med en partitionskatalog (till exempel /path/to/dir/date=2018-01-02/category=automobile).
Python
# Read all images from a directory
df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
display(df)
# Use partition discovery by specifying a partitioned path
df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/date=2024-01-01/category=dogs/")
display(df)
Scala
// Read all images from a directory
val df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.show()
// Use partition discovery by specifying a partitioned path
val partitioned = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/date=2024-01-01/category=dogs/")
partitioned.show()
SQL
-- Read all images from a directory
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'image'
)
Välj bildmetadata
Om du vill arbeta med bilddimensioner eller kanalinformation utan att bearbeta alla pixeldata väljer du specifika fält i image kolumnen struct.
Python
df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
metadata = df.select("image.origin", "image.height", "image.width", "image.nChannels")
display(metadata)
Scala
val df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
val metadata = df.select("image.origin", "image.height", "image.width", "image.nChannels")
metadata.show()
SQL
SELECT image.origin, image.height, image.width, image.nChannels FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'image'
)
Visa bilddata
Funktionen Databricks display renderar miniatyrbilder direkt i image kolumnen när du arbetar med bilddatakällan. Se Bilder för visningsalternativ som stöds.
Python
df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
display(df)
Scala
val df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.show()
SQL
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'image'
)
Spara bilddata i en Delta-tabell
Om du vill förbättra läsprestanda när du läser in bilddata igen sparar du DataFrame i en Delta-tabell.
Note
Bilddatakällan lagrar avkodade pixeldata, vilket ökar diskanvändningen jämfört med råa byte. För lagringseffektiv beständighet använder du datakällan för binära filer i stället.
Python
df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")
Scala
val df = spark.read.format("image").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")
Utdataschema
Bildfiler läses in som en dataram som innehåller en kolumn av typen struct som heter image med följande fält:
root
|-- image: struct (nullable = true)
| |-- origin: string (nullable = true)
| |-- height: integer (nullable = false)
| |-- width: integer (nullable = false)
| |-- nChannels: integer (nullable = false)
| |-- mode: integer (nullable = false)
| |-- data: binary (nullable = false)
Följande fält beskriver bildfilen och dess avkodade pixeldata.
-
origin: Källbildens filsökväg. -
height: Bildens höjd i bildpunkter. -
width: Bildens bredd i bildpunkter. -
nChannels: Antalet färgkanaler. Typiska värden är 1 för gråskalebilder, 3 för färgade bilder (till exempel RGB) och 4 för färgade bilder med alfakanal. -
mode: Heltalsflagga som anger hur du tolkar datafältet. Den anger datatypen och kanalordningen som data lagras i. Värdet för fältet förväntas (men framtvingas inte) för att mappas till någon av OpenCV-typerna som visas i följande tabell. OpenCV-typer definieras för 1, 2, 3 eller 4 kanaler och flera datatyper för pixelvärdena. Kanalordningen anger i vilken ordning färgerna lagras. Om du till exempel har en typisk trekanalsbild med röda, blå och gröna komponenter finns det sex möjliga beställningar. De flesta bibliotek använder antingen RGB eller BGR. OpenCV-typer med tre (fyra) kanaler förväntas ha BGR(A)-ordning.
Mappa typ till tal i OpenCV (datatyper x antal kanaler)
| Typ | C1 | C2 | C3 | C4 |
|---|---|---|---|---|
| CV_8U | 0 | 8 | 16 | 24 |
| CV_8S | 1 | 9 | 17 | 25 |
| CV_16U | 2 | 10 | 18 | 26 |
| CV_16S | 3 | 11 | 19 | 27 |
| CV_32U | 4 | 12 | 20 | 28 |
| CV_32S | 5 | 13 | 21 | 29 |
| CV_64F | 6 | 14 | 22 | 30 |
-
data: Bilddata som lagras i binärt format. Bilddata representeras som en 3-dimensionell matris med dimensionsformen (höjd, bredd, nChannels) och matrisvärden av typen t som anges av lägesfältet. Matrisen lagras i rad-större ordning.
Limitations
Eftersom bilddatakällan avkodar bildfiler när DataFrame skapas ökar datastorleken och har följande begränsningar:
- Diskanvändning vid beständig användning: Avkodade bilddata är betydligt större än råbyte. Om du bevarar DataFrame till en Delta-tabell lagrar du rådata i stället för avkodade data för att spara diskutrymme.
- Shuffle-prestanda: För att blanda avkodade bilddata krävs mer diskutrymme och nätverksbandbredd, vilket resulterar i långsammare shuffle-åtgärder. Fördröj avkodningen så länge som möjligt i pipelinen.
- Fast avkodningsbibliotek: Bilddatakällan använder javax Image IO-biblioteket för att avkoda bilder, vilket hindrar dig från att använda alternativa avkodningsbibliotek för bättre prestanda eller anpassad avkodningslogik.
Undvik dessa begränsningar genom att använda datakällan för binära filer för att läsa in bilddata och avkoda endast efter behov.
Ytterligare resurser
- Läs binära filer: Om din arbetsbelastning kräver råa bildbyte i stället för en avkodad struktur, undviker datakällan för binära filer omkostnaderna för avkodning och begränsningarna med datakällan för bilddata.