Selami Delta Lake: Penegakan dan Evolusi

Halo, Habr! Saya mempersembahkan untuk Anda terjemahan artikel "Menyelam di Danau Delta: Penegakan Skema & Evolusi" oleh Burak Yavuz, Brenner Heintz dan Denny Lee, yang disiapkan sebelum dimulainya kursus Kursus Insinyur Data dari OTUS.





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

Ini membawa kita ke masalah manajemen sirkuit. Karena tugas dan persyaratan bisnis berubah seiring waktu, struktur data Anda berubah. Delta Lake memudahkan untuk menerapkan pengukuran baru saat data berubah. Pengguna memiliki akses ke semantik sederhana untuk mengelola tata letak tabel mereka. Alat-alat ini termasuk Penegakan Skema, yang melindungi pengguna dari secara tidak sengaja menyumbat tabel mereka dengan kesalahan atau data yang tidak perlu, serta Skema Evolusi, yang secara otomatis menambahkan kolom baru dengan data berharga ke tempat yang sesuai. Pada artikel ini, kita akan mempelajari lebih dalam tentang penggunaan alat-alat ini.

Memahami Skema Tabel


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

Apa itu skema penegakan?


Penegakan Skema, juga dikenal sebagai Validasi Skema, adalah mekanisme pertahanan di Delta Lake yang menjamin kualitas data dengan menolak catatan yang tidak cocok dengan skema tabel. Seperti nyonya rumah di resepsi di restoran populer, yang hanya menerima dengan reservasi sebelumnya, ia memeriksa untuk melihat apakah setiap kolom data yang dimasukkan dalam tabel ada dalam daftar kolom yang diharapkan (dengan kata lain, apakah ada "reservasi" untuk masing-masing), dan menolak semua entri dengan kolom yang tidak ada dalam daftar.

Bagaimana cara menegakkan sirkuit bekerja?


Delta Lake menggunakan pemeriksaan skema saat menulis, yang berarti bahwa semua catatan baru dalam tabel diperiksa untuk kompatibilitas dengan skema tabel target selama perekaman. Jika skema ini tidak kompatibel, Delta Lake sepenuhnya membatalkan transaksi (data tidak tertulis) dan melemparkan pengecualian untuk memberi tahu pengguna tentang perbedaan tersebut.
Untuk menentukan kompatibilitas rekaman dengan tabel, Delta Lake menggunakan aturan berikut. DataFrame Tertulis:

  • tidak dapat berisi kolom tambahan yang tidak ada dalam skema tabel target. Dan sebaliknya, semuanya dalam urutan jika data input tidak benar-benar mengandung semua kolom dari tabel - kolom ini hanya akan diberi nilai nol.
  • , . StringType, DataFrame IntegerType, .
  • tidak dapat berisi nama kolom yang hanya berbeda dalam kasus. Ini berarti Anda tidak dapat memiliki kolom dengan nama 'Foo' dan 'foo' didefinisikan dalam tabel yang sama. Meskipun Spark dapat digunakan dalam case-sensitive atau case-insensitive (default), Delta Lake case-sensitive, tetapi case-insensitive. Parket peka huruf besar-kecil ketika menyimpan dan mengembalikan informasi kolom. Untuk menghindari kemungkinan kesalahan, korupsi data, atau kehilangan data (yang kami temui secara pribadi di Databricks), kami memutuskan untuk menambahkan batasan ini.

Untuk mengilustrasikan ini, mari kita lihat apa yang terjadi dalam kode di bawah ini ketika 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 secara otomatis menambahkan kolom baru, Delta Lake memaksakan bagan dan berhenti merekam. Untuk membantu menentukan kolom mana (atau sejumlah dari mereka) yang menjadi penyebab ketidakcocokan, Spark menarik kedua skema dari stack stack untuk perbandingan.

Apa gunanya menegakkan skema?


Karena menegakkan skema adalah tes yang cukup ketat, ini adalah alat yang hebat untuk menggunakan dataset yang bersih dan sepenuhnya ditransformasikan yang siap untuk produksi atau konsumsi sebagai penjaga gerbang. Sebagai aturan, ini diterapkan pada tabel yang secara langsung memasok data:

  • Algoritma Pembelajaran Mesin
  • Dasbor BI
  • Alat Analisis dan Visualisasi Data
  • Sistem produksi apa pun yang membutuhkan skema semantik yang sangat terstruktur dengan ketat.

Untuk menyiapkan data mereka untuk penghalang terakhir ini, banyak pengguna menggunakan arsitektur "multi-hop" sederhana, yang secara bertahap membawa struktur ke tabel mereka. Untuk mempelajari lebih lanjut tentang ini, Anda dapat membaca artikel Machine-Level Machine Learning Delta Lake.

Tentu saja, Anda dapat menggunakan aplikasi yang dipaksakan dari skema tersebut di mana saja di saluran Anda, tetapi ingat bahwa streaming ke tabel dalam kasus ini dapat membuat frustrasi, karena, misalnya, Anda lupa bahwa Anda menambahkan kolom lain ke data input.

Pencegahan Penipisan Data


Pada titik ini, Anda mungkin bertanya-tanya mengapa kegemparan seperti itu? Lagi pula, kadang-kadang kesalahan "schema mismatch" yang tidak terduga dapat membuat Anda ikut-ikutan dalam alur kerja Anda, terutama jika Anda baru mengenal Delta Lake. Mengapa tidak membiarkan skema berubah sesuai kebutuhan sehingga saya dapat menulis DataFrame saya, apa pun yang terjadi?

Seperti pepatah lama, "satu ons pencegahan bernilai satu pon penyembuhan." Pada titik tertentu, jika Anda tidak berhati-hati dalam menerapkan skema Anda, masalah kompatibilitas tipe data akan membuat kepala Anda menjijikkan - pada pandangan pertama, sumber data mentah yang homogen dapat berisi kasing garis batas, kolom yang rusak, pemetaan cacat, atau hal-hal menyeramkan lainnya yang diimpikan dalam mimpi buruk. Pendekatan terbaik adalah menghentikan musuh-musuh ini di gerbang - dengan memberlakukan skema - dan menghadapinya dengan terang, tidak lebih lambat, ketika mereka mulai menjelajahi kedalaman gelap kode kerja Anda.

Menerapkan skema memberi Anda keyakinan bahwa skema tabel Anda tidak akan berubah, kecuali jika Anda sendiri mengonfirmasi opsi perubahan. Ini mencegah pengenceran data, yang bisa terjadi ketika kolom baru ditambahkan begitu sering sehingga tabel terkompresi yang sebelumnya bernilai kehilangan nilai dan kegunaannya karena banjir data. Dengan mendorong Anda untuk disengaja, menetapkan standar tinggi, dan mengharapkan kualitas tinggi, menegakkan skema melakukan apa yang dimaksudkan untuk membantu Anda tetap jujur, dan menjaga meja Anda tetap bersih.

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

Apa itu evolusi sirkuit?


Evolusi skema adalah fitur yang memungkinkan pengguna untuk dengan mudah mengubah skema tabel saat ini menurut data yang berubah seiring waktu. Paling sering, ini digunakan ketika melakukan operasi menambah atau menulis ulang untuk secara otomatis menyesuaikan tata letak untuk memasukkan satu atau lebih kolom baru.

Bagaimana cara kerja evolusi rangkaian?


Mengikuti contoh dari bagian sebelumnya, pengembang dapat dengan mudah menggunakan evolusi skema untuk menambahkan kolom baru yang sebelumnya ditolak karena ketidakcocokan skema. Evolusi skema 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 query 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

gambar
Atau, Anda dapat mengatur opsi ini untuk seluruh sesi Spark dengan menambahkan spark.databricks.delta.schema.autoMerge = TrueSpark ke konfigurasi. Tetapi gunakan ini dengan hati-hati, karena menegakkan skema tidak akan lagi memperingatkan Anda tentang ketidakkonsistenan yang tidak disengaja dengan skema tersebut.

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

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

Jenis perubahan skema berikut dapat diterima sebagai bagian dari evolusi skema saat menambahkan atau menulis ulang tabel:

  • Menambahkan kolom baru (ini adalah skenario paling umum)
  • Ubah tipe data dari NullType -> tipe lain atau naikkan dari ByteType -> ShortType -> IntegerType

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

  • hapus kolom
  • ubah tipe data dari kolom yang ada (di tempat)
  • mengganti nama kolom yang hanya peka huruf besar-kecil (misalnya, "Foo" dan "foo")

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

  • menambahkan kolom
  • ubah komentar kolom
  • mengatur properti tabel yang menentukan perilaku tabel, misalnya, mengatur durasi penyimpanan log transaksi.

Apa gunanya evolusi rangkaian?


Anda selalu dapat menggunakan evolusi skema ketika Anda bermaksud untuk mengubah skema tabel Anda (sebagai lawan dari kasus ketika Anda secara tidak sengaja menambahkan kolom ke DataFrame Anda yang seharusnya tidak ada di sana). Ini adalah cara termudah untuk memigrasi skema Anda karena secara otomatis menambahkan nama kolom dan tipe data yang benar tanpa perlu mendeklarasikannya secara eksplisit.

Kesimpulan


Memaksa 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 fakta bahwa data mereka memiliki tingkat integritas tertinggi, dengan alasan tentang hal itu dengan jelas dan jelas, memungkinkan mereka untuk membuat keputusan bisnis yang lebih efektif.

Di sisi lain, evolusi sirkuit melengkapi penegakan hukum, menyederhanakan perubahan otomatis yang dituduhkan ke sirkuit. Pada akhirnya, seharusnya tidak sulit untuk menambahkan kolom.

Aplikasi paksa dari sirkuit adalah Yang, di mana evolusi sirkuit adalah yin. Saat digunakan bersama, fitur-fitur ini membuat pengurangan noise dan penyetelan sinyal menjadi lebih mudah dari sebelumnya.

Kami juga ingin mengucapkan terima kasih kepada Mukul Murti dan Pranava Ananda atas kontribusi mereka pada artikel ini.

Artikel lain dalam seri ini:

Selami Delta Lake: Membongkar Log Transaksi



Artikel terkait


Delta Lake Production Level Machine Learning

Apa itu data lake?



Pelajari lebih lanjut tentang kursus



All Articles