Penyelaman Danau Delta: Penegakan Skema dan Evolusi

Hei Habr! Untuk perhatian Anda, saya persembahkan terjemahan artikel tersebut "Menyelam Ke Danau Delta: Penegakan Skema & Evolusi" penulis Burak Yavuz, Brenner Heintz dan Denny Lee, yang dipersiapkan untuk mengantisipasi dimulainya kursus Insinyur Data dari OTUS.

Penyelaman Danau Delta: Penegakan Skema dan Evolusi

Data, seperti pengalaman kami, terus terakumulasi dan berkembang. Untuk mengimbanginya, model mental kita tentang dunia harus beradaptasi dengan data baru, beberapa di antaranya berisi dimensi baru—cara baru untuk mengamati hal-hal yang tidak kita ketahui sebelumnya. Model mental ini tidak jauh berbeda dengan skema tabel yang menentukan bagaimana kita mengklasifikasikan dan memproses informasi baru.

Ini membawa kita ke masalah manajemen skema. Karena tujuan dan persyaratan bisnis berubah seiring waktu, struktur data Anda juga berubah. Delta Lake memudahkan penerapan pengukuran baru saat data berubah. Pengguna memiliki akses ke semantik sederhana untuk mengelola skema tabel mereka. Alat-alat ini termasuk Penegakan Skema, yang melindungi pengguna dari pencemaran tabel mereka secara tidak sengaja dengan kesalahan atau data yang tidak perlu, dan Evolusi Skema, yang memungkinkan kolom baru dari data berharga ditambahkan secara otomatis di tempat yang sesuai. Pada artikel ini, kami akan mempelajari penggunaan alat-alat ini.

Memahami skema tabel

Setiap DataFrame di Apache Spark berisi skema yang menentukan bentuk data seperti tipe data, kolom, dan metadata. Dengan Delta Lake, skema tabel disimpan dalam format JSON di dalam log transaksi.

Apa itu Penegakan Skema?

Penegakan Skema, juga dikenal sebagai Validasi Skema, adalah mekanisme perlindungan di Delta Lake yang menjamin kualitas data dengan menolak catatan yang tidak cocok dengan skema tabel. Seperti seorang nyonya rumah di meja depan sebuah restoran populer yang hanya menerima reservasi, dia memeriksa untuk melihat apakah setiap kolom data yang dimasukkan ke dalam tabel ada dalam daftar kolom yang diharapkan yang sesuai (dengan kata lain, jika ada "pemesanan" untuk masing-masing), dan menolak setiap entri dengan kolom yang tidak ada dalam daftar.

Bagaimana cara kerja penegakan skema?

Delta Lake menggunakan validasi skema saat menulis, yang berarti bahwa semua penulisan baru ke tabel diperiksa kompatibilitasnya dengan skema tabel target pada waktu penulisan. Jika skema tidak konsisten, Delta Lake sepenuhnya membalikkan transaksi (tidak ada data yang ditulis) dan melontarkan pengecualian untuk memberi tahu pengguna tentang ketidakkonsistenan tersebut.
Delta Lake menggunakan aturan berikut untuk menentukan apakah catatan kompatibel dengan tabel. Bingkai Data Tertulis:

  • tidak dapat berisi kolom tambahan yang tidak ada dalam skema tabel target. Sebaliknya, semuanya baik-baik saja jika data yang masuk tidak benar-benar berisi semua kolom dari tabel - kolom ini hanya akan diberi nilai nol.
  • tidak dapat memiliki tipe data kolom yang berbeda dari tipe data kolom di tabel target. Jika kolom dalam tabel target berisi data StringType, tetapi kolom terkait dalam DataFrame berisi data IntegerType, penerapan skema akan melontarkan pengecualian dan mencegah terjadinya operasi tulis.
  • tidak boleh berisi nama kolom yang berbeda hanya dalam kasus. Ini berarti bahwa Anda tidak dapat memiliki kolom bernama 'Foo' dan 'foo' yang ditentukan dalam tabel yang sama. Sementara Spark dapat digunakan dalam mode case-sensitive atau case-insensitive (default), Delta Lake mempertahankan huruf besar-kecil tetapi tidak sensitif dalam penyimpanan skema. Parket peka terhadap huruf besar-kecil saat menyimpan dan mengembalikan informasi kolom. Untuk menghindari kemungkinan kesalahan, kerusakan data, atau kehilangan data (yang kami alami secara pribadi di Databricks), kami memutuskan untuk menambahkan batasan ini.

Untuk mengilustrasikannya, mari kita lihat apa yang terjadi pada kode di bawah saat mencoba menambahkan beberapa kolom yang baru dibuat ke tabel Delta Lake yang belum dikonfigurasi untuk menerimanya.

# Сгенерируем DataFrame ссуд, который мы добавим в нашу таблицу Delta Lake
loans = sql("""
            SELECT addr_state, CAST(rand(10)*count as bigint) AS count,
            CAST(rand(10) * 10000 * count AS double) AS amount
            FROM loan_by_state_delta
            """)

# Вывести исходную схему DataFrame
original_loans.printSchema()

root
  |-- addr_state: string (nullable = true)
  |-- count: integer (nullable = true)
 
# Вывести новую схему DataFrame
loans.printSchema()
 
root
  |-- addr_state: string (nullable = true)
  |-- count: integer (nullable = true)
  |-- amount: double (nullable = true) # new column
 
# Попытка добавить новый DataFrame (с новым столбцом) в существующую таблицу
loans.write.format("delta") 
           .mode("append") 
           .save(DELTALAKE_PATH)

Returns:

A schema mismatch detected when writing to the Delta table.
 
To enable schema migration, please set:
'.option("mergeSchema", "true")'
 
Table schema:
root
-- addr_state: string (nullable = true)
-- count: long (nullable = true)
 
Data schema:
root
-- addr_state: string (nullable = true)
-- count: long (nullable = true)
-- amount: double (nullable = true)
 
If Table ACLs are enabled, these options will be ignored. Please use the ALTER TABLE command for changing the schema.

Alih-alih menambahkan kolom baru secara otomatis, Delta Lake memberlakukan skema dan berhenti merekam. Untuk membantu menentukan kolom mana (atau kumpulannya) yang menyebabkan ketidakcocokan, Spark memunculkan kedua skema dari tumpukan pelacakan untuk perbandingan.

Apa manfaat dari penegakan skema?

Karena penegakan skema adalah pemeriksaan yang cukup ketat, ini adalah alat yang hebat untuk digunakan sebagai penjaga gerbang dari kumpulan data yang bersih dan sepenuhnya diubah yang siap untuk diproduksi atau dikonsumsi. Biasanya diterapkan pada tabel yang memasukkan data secara langsung:

  • Algoritma pembelajaran mesin
  • dasbor BI
  • Analisis data dan alat visualisasi
  • Setiap sistem produksi yang membutuhkan skema semantik yang sangat terstruktur dan diketik dengan kuat.

Untuk menyiapkan data mereka untuk rintangan terakhir ini, banyak pengguna menggunakan arsitektur "multi-hop" sederhana yang secara bertahap memperkenalkan struktur ke dalam tabel mereka. Untuk mempelajari lebih lanjut tentang ini, Anda dapat membaca artikelnya Pembelajaran mesin tingkat produksi dengan Delta Lake.

Tentu saja, penerapan skema dapat digunakan di mana saja dalam pipeline Anda, tetapi perlu diingat bahwa streaming penulisan ke tabel dapat membuat frustasi dalam kasus ini, karena, misalnya, Anda lupa menambahkan kolom lain ke data yang masuk.

Pencegahan penipisan data

Pada titik ini, Anda mungkin bertanya-tanya mengapa hype? Lagi pula, terkadang kesalahan "ketidakcocokan skema" yang tidak terduga dapat membuat Anda tersandung dalam alur kerja, terutama jika Anda baru di Delta Lake. Mengapa tidak membiarkan skema berubah sesuai kebutuhan sehingga saya dapat menulis DataFrame saya apa pun yang terjadi?

Seperti kata pepatah lama, "Satu ons pencegahan bernilai satu pon pengobatan." Pada titik tertentu, jika Anda tidak berhati-hati untuk menegakkan skema Anda, masalah kompatibilitas tipe data akan memunculkan kepalanya yang jelek - sumber data mentah yang tampaknya homogen dapat berisi kasus tepi, kolom rusak, pemetaan salah bentuk, atau hal menakutkan lainnya yang Anda impikan .dalam mimpi buruk. Pendekatan terbaik adalah menghentikan musuh-musuh ini di gerbang - dengan penegakan skema - dan menangani mereka secara terang-terangan, tidak nanti ketika mereka mulai berkeliaran di kedalaman gelap kode produksi Anda.

Penegakan skema memberi Anda keyakinan bahwa skema tabel Anda tidak akan berubah kecuali jika Anda mengonfirmasi perubahan itu sendiri. Ini mencegah pengenceran data yang dapat terjadi ketika kolom baru ditambahkan begitu sering sehingga tabel terkompresi yang berharga sebelumnya kehilangan nilai dan kegunaannya karena banjir data. Dengan mendorong Anda untuk berhati-hati, menetapkan standar tinggi, dan mengharapkan kualitas tinggi, penegakan skema melakukan persis seperti yang dirancang untuk dilakukan—membantu Anda tetap berhati-hati dan menjaga kebersihan spreadsheet.

Jika, setelah pertimbangan lebih lanjut, Anda memutuskan bahwa Anda benar-benar untuk tambahkan kolom baru - tidak masalah, di bawah ini adalah perbaikan satu baris. Solusinya adalah evolusi sirkuit!

Apa itu evolusi skema?

Evolusi skema adalah fitur yang memungkinkan pengguna untuk dengan mudah mengubah skema tabel saat ini agar sesuai dengan data yang berubah dari waktu ke waktu. Ini paling sering digunakan saat melakukan operasi penambahan atau penimpaan untuk menyesuaikan skema secara otomatis agar menyertakan satu atau beberapa kolom baru.

Bagaimana cara kerja evolusi skema?

Mengikuti contoh di bagian sebelumnya, pengembang dapat dengan mudah menggunakan evolusi skema untuk menambahkan kolom baru yang sebelumnya ditolak karena ketidakkonsistenan skema. Evolusi sirkuit diaktifkan dengan menambahkan .option('mergeSchema', 'true') ke tim Spark Anda .write или .writeStream.

# Добавьте параметр mergeSchema
loans.write.format("delta") 
           .option("mergeSchema", "true") 
           .mode("append") 
           .save(DELTALAKE_SILVER_PATH)

Untuk melihat grafik, jalankan kueri Spark SQL berikut

# Создайте график с новым столбцом, чтобы подтвердить, что запись прошла успешно
%sql
SELECT addr_state, sum(`amount`) AS amount
FROM loan_by_state_delta
GROUP BY addr_state
ORDER BY sum(`amount`)
DESC LIMIT 10

Penyelaman Danau Delta: Penegakan Skema dan Evolusi
Alternatifnya, Anda dapat menyetel opsi ini untuk seluruh sesi Spark dengan menambahkan spark.databricks.delta.schema.autoMerge = True ke konfigurasi Spark. Tapi gunakan ini dengan hati-hati, karena penegakan skema tidak akan lagi memperingatkan Anda tentang ketidakkonsistenan skema yang tidak disengaja.

Dengan memasukkan parameter dalam permintaan mergeSchema, semua kolom yang ada di DataFrame tetapi tidak ada di tabel target secara otomatis ditambahkan ke akhir skema sebagai bagian dari transaksi tulis. Bidang bersarang juga dapat ditambahkan dan ini juga akan ditambahkan ke akhir kolom struktur yang sesuai.

Teknisi tanggal dan ilmuwan data dapat menggunakan opsi ini untuk menambahkan kolom baru (mungkin metrik yang baru-baru ini dilacak atau kolom angka penjualan bulan ini) ke tabel produksi pembelajaran mesin yang ada tanpa merusak model yang ada berdasarkan kolom lama.

Jenis perubahan skema berikut diperbolehkan sebagai bagian dari evolusi skema saat menambahkan atau menimpa tabel:

  • Menambahkan kolom baru (ini adalah skenario yang paling umum)
  • Mengubah tipe data dari NullType -> tipe atau promosi lainnya dari ByteType -> ShortType -> IntegerType

Perubahan lain yang tidak diperbolehkan sebagai bagian dari evolusi skema mengharuskan skema dan data ditimpa dengan menambahkan .option("overwriteSchema", "true"). Misalnya, dalam kasus di mana kolom "Foo" awalnya adalah bilangan bulat dan skema baru akan menjadi tipe data string, maka semua file Parquet(data) perlu ditimpa. Perubahan ini meliputi:

  • menghapus kolom
  • mengubah tipe data kolom yang ada (di tempat)
  • mengganti nama kolom yang berbeda hanya dalam kasus (misalnya, "Foo" dan "foo")

Terakhir, dengan rilis Spark 3.0 berikutnya, DDL eksplisit (menggunakan ALTER TABLE) akan didukung sepenuhnya, memungkinkan pengguna melakukan tindakan berikut pada skema tabel:

  • menambahkan kolom
  • mengubah kolom komentar
  • menyetel properti tabel yang menentukan perilaku tabel, seperti menyetel berapa lama log transaksi disimpan.

Apa manfaat dari evolusi skema?

Evolusi skematis dapat digunakan kapan pun Anda bermaksud ubah skema tabel Anda (sebagai kebalikan dari saat Anda secara tidak sengaja menambahkan kolom ke DataFrame Anda yang seharusnya tidak ada). Ini adalah cara termudah untuk memigrasi skema Anda karena secara otomatis menambahkan nama kolom dan tipe data yang benar tanpa harus mendeklarasikannya secara eksplisit.

Kesimpulan

Penegakan skema menolak kolom baru atau perubahan skema lainnya yang tidak kompatibel dengan tabel Anda. Dengan menetapkan dan mempertahankan standar tinggi ini, analis dan insinyur dapat mengandalkan data mereka untuk memiliki tingkat integritas tertinggi, mempertimbangkannya dengan jelas dan ringkas, memungkinkan mereka membuat keputusan bisnis yang lebih baik.

Di sisi lain, evolusi skema melengkapi penegakan dengan penyederhanaan diperkirakan perubahan skema otomatis. Lagi pula, seharusnya tidak sulit untuk menambahkan kolom.

Penegakan skema adalah yang, di mana evolusi skema adalah yin. Saat digunakan bersama, fitur ini membuat pengurangan noise dan penyetelan sinyal menjadi lebih mudah dari sebelumnya.

Kami juga ingin berterima kasih kepada Mukul Murthy dan Pranav Anand atas kontribusi mereka pada artikel ini.

Artikel lain dalam seri ini:

Menyelam ke Danau Delta: membongkar log transaksi

Artikel Terkait

Pembelajaran mesin tingkat produksi dengan Delta Lake

Apa itu danau data?

Pelajari lebih lanjut tentang kursus ini

Sumber: www.habr.com

Tambah komentar