Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Penting
Databricks merekomendasikan agar Anda menggunakan sumber data file biner untuk memuat data gambar ke Spark DataFrame sebagai byte mentah. Lihat Solusi referensi untuk aplikasi gambar untuk alur kerja yang direkomendasikan untuk menangani data gambar.
Sumber data gambar menyediakan API standar untuk memuat file gambar ke dalam Spark DataFrames sebagai struktur yang didekodekan, memberi Anda akses langsung ke metadata gambar seperti tinggi, lebar, jumlah saluran, dan data piksel mentah. Ini terutama digunakan dalam alur pra-pemrosesan pembelajaran mesin di mana bidang gambar terstruktur diperlukan bersama data piksel. Azure Databricks mendukung sumber data gambar untuk pembacaan batch, termasuk penemuan partisi untuk direktori gambar yang terorganisir. Untuk membaca file gambar, tentukan sumber data format sebagai image.
Prasyarat
Azure Databricks tidak memerlukan konfigurasi tambahan untuk menggunakan sumber data gambar.
Opsi
.option() Gunakan metode .options() dan DataFrameReader untuk mengonfigurasi sumber data gambar. Untuk daftar lengkap opsi yang didukung, lihat Referensi opsi Spark API.
Usage
Contoh berikut menunjukkan pemuatan file gambar menggunakan Spark DataFrame API, memilih bidang metadata gambar, menampilkan gambar mini gambar, dan menyimpan data gambar yang didekodekan ke tabel Delta.
Membaca file gambar
Gunakan Apache Spark DataFrame API untuk memuat file gambar ke dalam DataFrame. Anda dapat mengimpor struktur direktori berlapis dengan menyediakan jalur direktori, dan menggunakan penemuan partisi dengan menentukan jalur dengan direktori partisi (misalnya, /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'
)
Pilih metadata gambar
Untuk bekerja dengan dimensi gambar atau informasi saluran tanpa memproses data piksel lengkap, pilih bidang tertentu dari image kolom 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'
)
Menampilkan data gambar
Fungsi Databricks display menampilkan thumbnail gambar langsung di kolom image saat menggunakan sumber data gambar. Lihat Gambar untuk opsi tampilan yang didukung.
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'
)
Menyimpan data gambar ke tabel Delta
Untuk meningkatkan performa baca saat memuat data gambar kembali, simpan DataFrame ke tabel Delta.
Note
Sumber data gambar menyimpan data piksel yang didekodekan, yang meningkatkan penggunaan disk dibandingkan dengan byte mentah. Untuk persistensi yang efisien penyimpanan, gunakan sumber data file biner sebagai gantinya.
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>")
Skema keluaran
File gambar dimuat sebagai DataFrame yang berisi satu kolom jenis struct yang disebut image dengan bidang berikut:
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)
Bidang berikut menjelaskan file gambar dan data piksel yang didekodekan.
-
origin: Jalur file gambar sumber. -
height: Tinggi gambar dalam piksel. -
width: Lebar gambar dalam piksel. -
nChannels: Jumlah saluran warna. Nilai umumnya adalah 1 untuk gambar skala abu-abu, 3 untuk gambar berwarna (misalnya, RGB), dan 4 untuk gambar berwarna dengan saluran alfa. -
mode: Flag bilangan bulat yang menunjukkan cara menafsirkan bidang data. Ini menentukan jenis data dan urutan saluran data yang disimpan. Nilai bidang diharapkan sesuai dengan salah satu jenis OpenCV yang ditampilkan dalam tabel berikut, namun tidak wajib. Jenis OpenCV ditentukan untuk 1, 2, 3, atau 4 saluran dan beberapa jenis data untuk nilai piksel. Urutan saluran menentukan urutan penyimpanan warna. Misalnya, jika Anda memiliki gambar tiga saluran yang khas dengan komponen merah, biru, dan hijau, ada enam kemungkinan pemesanan. Sebagian besar pustaka menggunakan RGB atau BGR. Tiga (empat) jenis saluran OpenCV diharapkan berada dalam urutan BGR (A).
Peta jenis ke angka di OpenCV (jenis data x jumlah saluran)
| Jenis | 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: Data gambar disimpan dalam format biner. Data gambar direpresentasikan sebagai array 3 dimensi dengan bentuk dimensi (tinggi, lebar, nChannels) dan nilai array jenis t yang ditentukan oleh bidang mode. Larik disimpan dalam urutan baris-mayor.
Keterbatasan
Karena sumber data gambar mendekode file gambar selama pembuatan DataFrame, ukuran data meningkat dan memiliki keterbatasan berikut:
- Penggunaan ruang disk saat disimpan: Data gambar yang didekodekan jauh lebih besar daripada byte mentah. Jika Anda mempertahankan DataFrame ke tabel Delta, simpan byte mentah alih-alih data yang didekode untuk menghemat ruang disk.
- Kinerja shuffle: Mengacak data gambar yang telah didekode memerlukan lebih banyak ruang disk dan bandwidth jaringan, sehingga operasi shuffle menjadi lebih lambat. Tunda proses dekode selama mungkin dalam pipeline Anda.
- Pustaka dekode tetap: Sumber data gambar menggunakan pustaka javax Image IO untuk mendekode gambar, sehingga Anda tidak dapat menggunakan pustaka dekode alternatif untuk kinerja yang lebih baik atau logika dekode khusus.
Untuk menghindari batasan ini, gunakan sumber data file biner untuk memuat data gambar dan dekode hanya sesuai kebutuhan.
Sumber daya tambahan
- Baca file biner: Jika beban kerja Anda memerlukan byte gambar mentah alih-alih struktur hasil dekode, sumber data file biner menghindari overhead dekode dan keterbatasan sumber data gambar.