Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wichtig
Databricks empfiehlt, die Binärdatei-Datenquelle zu verwenden, um Bilddaten als Rohbytes in den Spark DataFrame zu laden. Siehe Referenzlösung für Bildanwendungen für den empfohlenen Workflow zum Umgang mit Image-Daten.
Die Bilddatenquelle stellt eine Standard-API zum Laden von Bilddateien in Spark DataFrames als decodierte Struktur bereit, sodass Sie direkten Zugriff auf Bildmetadaten wie Höhe, Breite, Kanalanzahl und unformatierte Pixeldaten erhalten. Es wird in erster Linie in Machine Learning Preprocessing-Pipelines verwendet, bei denen strukturierte Bildfelder zusammen mit Pixeldaten erforderlich sind. Azure Databricks unterstützt die Bilddatenquelle für Batchlesevorgänge, einschließlich partitionsermittlung für organisierte Bildverzeichnisse. Um Image-Dateien zu lesen, geben Sie die Datenquelle format als image an.
Voraussetzungen
Azure Databricks erfordert keine zusätzliche Konfiguration, um die Bilddatenquelle zu verwenden.
Options
Verwenden Sie die Methoden .option() und .options() von DataFrameReader, um die Bilddatenquelle zu konfigurieren. Eine vollständige Liste der unterstützten Optionen finden Sie in der Spark-API-Optionsreferenz.
Usage
Die folgenden Beispiele veranschaulichen das Laden von Bilddateien mithilfe der Spark DataFrame-API, das Auswählen von Bildmetadatenfeldern, das Anzeigen von Miniaturansichten von Bildern und das Speichern decodierter Bilddaten in einer Delta-Tabelle.
Lesen von Bilddateien
Verwenden Sie die Apache Spark DataFrame-API, um Bilddateien in einen DataFrame zu laden. Sie können eine geschachtelte Verzeichnisstruktur importieren, indem Sie einen Verzeichnispfad angeben und die Partitionsermittlung verwenden, indem Sie einen Pfad mit einem Partitionsverzeichnis angeben (z. B /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'
)
Auswählen von Bildmetadaten
Wenn Sie mit Bildabmessungen oder Kanalinformationen arbeiten möchten, ohne die vollständigen Pixeldaten zu verarbeiten, wählen Sie bestimmte Felder aus der image Strukturspalte aus.
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'
)
Anzeigen von Image-Daten
Die Databricks-Funktion display rendert Bildminiaturansichten direkt in der image Spalte beim Arbeiten mit der Bilddatenquelle. Unter "Bilder " finden Sie unterstützte Anzeigeoptionen.
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'
)
Speichern von Bilddaten in einer Delta-Tabelle
Um die Leseleistung beim Laden von Bilddaten wieder zu verbessern, speichern Sie den DataFrame in einer Delta-Tabelle.
Note
Die Bilddatenquelle speichert decodierte Pixeldaten, wodurch die Datenträgernutzung im Vergleich zu unformatierten Bytes erhöht wird. Verwenden Sie für die speichereffiziente Persistenz stattdessen die Binäre Dateidatenquelle .
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>")
Ausgabeschema
Image-Dateien werden als Datenrahmen geladen, der eine einzelne Strukturtyp-Spalte namens image mit den folgenden Feldern enthä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)
In den folgenden Feldern werden die Bilddatei und die decodierten Pixeldaten beschrieben.
-
origin: Der Dateipfad des Quellbilds. -
height: Die Höhe des Bilds in Pixel. -
width: Die Breite des Bilds in Pixeln. -
nChannels: Die Anzahl der Farbkanäle. Typische Werte sind 1 für Graustufenbilder, 3 für farbige Bilder (z. B. RGB) und 4 für farbige Bilder mit Alphakanal. -
mode: Integer-Flag, das angibt, wie das Datenfeld zu interpretieren ist. Es gibt den Datentyp und die Kanalreihenfolge an, in der die Daten gespeichert werden. Es wird erwartet (aber nicht erzwungen), dass der Wert des Felds einem der in der folgenden Tabelle aufgeführten OpenCV-Typen entspricht. OpenCV-Typen werden für 1, 2, 3 oder 4 Kanäle und mehrere Datentypen für die Pixelwerte definiert. Kanalreihenfolge gibt die Reihenfolge an, in der die Farben gespeichert werden. Wenn Sie beispielsweise über ein typisches Bild mit drei Kanälen mit roten, blauen und grünen Komponenten verfügen, gibt es sechs mögliche Reihenfolgen. Die meisten Bibliotheken verwenden entweder RGB oder BGR. Es wird erwartet, dass drei (vier) OpenCV-Kanaltypen in BGR(A)-Reihenfolge sind.
Zuordnung des Typs zu Zahlen in OpenCV (Datentypen x Anzahl von Kanälen)
| 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: Image-Daten, die in einem Binärformat gespeichert sind. Bilddaten werden als ein dreidimensionales Array mit der Dimensionsform (Höhe, Breite, nChannels) und Arraywerten vom Typ t dargestellt, die vom Modusfeld angegeben werden. Das Array wird in zeilenweiser Reihenfolge gespeichert.
Limitations
Da die Bilddatenquelle Bilddateien während der Erstellung von DataFrame decodiert, erhöht sie die Datengröße und hat die folgenden Einschränkungen:
- Speicherplatzbedarf beim Speichern: Dekodierte Bilddaten sind wesentlich größer als Rohbytes. Wenn Sie den DataFrame in einer Delta-Tabelle beibehalten, speichern Sie unformatierte Bytes anstelle decodierter Daten, um Speicherplatz zu sparen.
- Shuffle-Leistung: Das Mischen decodierter Bilddaten erfordert mehr Festplattenspeicher und Netzwerkbandbreite, was zu langsameren Shuffle-Vorgängen führt. Verzögern Sie die Decodierung so lange wie möglich in Ihrer Pipeline.
- Feste Dekodierungsbibliothek: Die Bilddatenquelle verwendet die Bibliothek javax Image IO, um Bilder zu dekodieren, wodurch Sie keine alternativen Dekodierungsbibliotheken für eine bessere Leistung oder benutzerdefinierte Dekodierungslogik verwenden können.
Um diese Einschränkungen zu vermeiden, verwenden Sie die Binäre Dateidatenquelle, um Bilddaten zu laden und nur nach Bedarf zu decodieren.
Weitere Ressourcen
- Lesen von Binärdateien: Wenn Ihre Workload unformatierte Bildbytes anstelle einer decodierten Struktur erfordert, vermeidet die Binärdateidatenquelle den Decodierungsaufwand und einschränkungen der Bilddatenquelle.