Hello, Habr! Saya membentangkan kepada anda terjemahan artikel oleh Burak Yavuz, Brenner Heintz dan Denny Lee, yang disediakan untuk menjangkakan pelancaran kursus daripada OTUS.

Data, seperti pengalaman kami, sentiasa terkumpul dan berkembang. Untuk mengikuti perkembangan, model mental dunia kita mesti menyesuaikan diri dengan data baharu, beberapa daripadanya mengandungi dimensi baharu—cara baharu untuk memerhati perkara yang sebelum ini kita tidak tahu. Model mental ini tidak berbeza dengan skema dalam hamparan yang menentukan cara kami mengelas dan memproses maklumat baharu.
Ini membawa kita kepada isu pengurusan skema. Apabila matlamat dan keperluan perniagaan berkembang dari semasa ke semasa, begitu juga struktur data anda. Delta Lake memudahkan untuk memperkenalkan dimensi baharu apabila data berubah. Pengguna mempunyai akses kepada semantik mudah untuk mengurus skema jadual mereka. Alat ini termasuk Penguatkuasaan Skema, yang melindungi pengguna daripada mengacaukan jadual mereka secara tidak sengaja dengan ralat atau data yang tidak diperlukan, dan Skema Evolusi, yang secara automatik menambah lajur baharu yang mengandungi data berharga di lokasi yang sesuai. Dalam artikel ini, kita akan menyelami lebih mendalam menggunakan alat ini.
Memahami skema jadual
Setiap DataFrame dalam Apache Spark mengandungi skema yang mentakrifkan bentuk data, seperti jenis data, lajur dan metadata. Dengan Delta Lake, skema jadual disimpan dalam format JSON dalam log transaksi.
Apakah penguatkuasaan skim?
Penguatkuasaan Skema, juga dikenali sebagai Pengesahan Skema, ialah mekanisme keselamatan di Delta Lake yang memastikan kualiti data dengan menolak rekod yang tidak mematuhi skema jadual. Seperti tuan rumah di restoran popular yang hanya menerima tempahan, Penguatkuasaan Skema menyemak sama ada setiap lajur data yang dimasukkan ke dalam jadual berada pada senarai sepadan lajur dijangka (dengan kata lain, sama ada terdapat "tempahan" untuk setiap satu) dan menolak sebarang rekod dengan lajur yang tiada dalam senarai.
Bagaimanakah penguatkuasaan skema berfungsi?
Delta Lake menggunakan semakan skema atas tulisan, bermakna semua penulisan baharu pada jadual disemak untuk keserasian dengan skema jadual sasaran pada masa tulis. Jika skema tidak serasi, Delta Lake membatalkan transaksi sepenuhnya (tiada data ditulis) dan menimbulkan pengecualian untuk memberitahu pengguna tentang ketidakkonsistenan itu.
Delta Lake menggunakan peraturan berikut untuk menentukan sama ada rekod serasi dengan jadual. DataFrame sedang ditulis:
- Ia tidak boleh mengandungi lajur tambahan yang tidak terdapat dalam skema jadual sasaran. Sebaliknya, tidak mengapa jika data masuk tidak mengandungi setiap lajur daripada jadual—lajur tersebut hanya akan diberikan nilai nol.
- tidak boleh mempunyai jenis data lajur yang berbeza daripada jenis data lajur dalam jadual sasaran. Jika lajur dalam jadual sasaran mengandungi data StringType, tetapi lajur yang sepadan dalam DataFrame mengandungi data IntegerType, penguatkuasaan skema akan membuang pengecualian dan menghalang operasi tulis daripada berlaku.
- tidak boleh mengandungi nama lajur yang berbeza hanya dalam kes. Ini bermakna anda tidak boleh menetapkan lajur bernama 'Foo' dan 'foo' dalam jadual yang sama. Walaupun Spark boleh digunakan dalam huruf kecil atau huruf kecil (secara lalai), Delta Lake mengekalkan huruf besar tetapi tidak sensitif huruf besar apabila menyimpan skema. Parket peka huruf besar-kecil apabila menyimpan dan mendapatkan maklumat lajur. Untuk mengelakkan kemungkinan ralat, kerosakan data atau kehilangan data (yang kami alami secara peribadi di Databricks), kami memutuskan untuk menambah sekatan ini.
Untuk menggambarkan perkara ini, mari kita lihat apa yang berlaku dalam kod di bawah apabila kita cuba menambah beberapa lajur yang baru dijana pada jadual Tasik Delta yang belum dikonfigurasikan 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.Daripada menambah lajur baharu secara automatik, Delta Lake menguatkuasakan skema dan berhenti menulis. Untuk membantu menentukan lajur (atau set lajur) yang menyebabkan percanggahan, Spark memaparkan kedua-dua skema daripada surih tindanan untuk perbandingan.
Apakah faedah menguatkuasakan skim tersebut?
Oleh kerana penguatkuasaan skema adalah semakan yang agak ketat, ia merupakan alat yang sangat baik untuk digunakan sebagai penjaga pintu kepada set data yang bersih dan berubah sepenuhnya sedia untuk pengeluaran atau penggunaan. Ia biasanya digunakan pada jadual yang memberi suapan data secara langsung:
- Algoritma pembelajaran mesin
- papan pemuka BI
- Alat analisis dan visualisasi data
- Mana-mana sistem pengeluaran yang memerlukan skema semantik berstruktur ketat dan ditaip ketat.
Untuk menyediakan data mereka untuk halangan terakhir ini, ramai pengguna menggunakan seni bina "multi-hop" mudah yang secara beransur-ansur memperkenalkan struktur ke dalam jadual mereka. Untuk maklumat lanjut, anda boleh membaca artikel tersebut
Sudah tentu, anda boleh menggunakan penguatkuasaan skema di mana-mana sahaja dalam saluran paip anda, tetapi ingat bahawa menulis pada jadual dalam kes ini boleh mengecewakan, contohnya, kerana anda terlupa bahawa anda menambah lajur lain pada data masuk.
Mencegah pencairan data
Pada ketika ini, anda mungkin tertanya-tanya apakah semua kekecohan itu? Lagipun, kadangkala ralat "ketakpadanan skema" yang tidak dijangka boleh menyebabkan anda tersandung dalam aliran kerja anda, terutamanya jika anda baru di Delta Lake. Mengapa tidak biarkan sahaja skema berubah mengikut keperluan supaya saya boleh menulis DataFrame saya tidak kira apa pun?
Seperti kata pepatah lama, "satu auns pencegahan bernilai satu paun penawar." Pada satu ketika, jika anda tidak berhati-hati untuk menguatkuasakan skema anda, isu keserasian jenis data akan menimbulkan masalah buruk—sumber data mentah yang kelihatan homogen mungkin mengandungi kes tepi, lajur rosak, pemetaan yang tidak betul atau mimpi ngeri yang lain. Pendekatan terbaik ialah menghentikan musuh-musuh ini di pintu masuk—dengan penguatkuasaan skema—dan berurusan dengan mereka secara terbuka, bukannya kemudian, apabila mereka mula mengintai dalam kedalaman gelap kod pengeluaran anda.
Penguatkuasaan skema memastikan bahawa skema jadual anda tidak akan berubah melainkan anda meluluskan perubahan secara eksplisit. Ini menghalang pencairan data, yang boleh berlaku apabila lajur baharu ditambah dengan begitu kerap sehingga jadual padat yang berharga sebelum ini kehilangan makna dan kegunaannya akibat banjir data. Dengan menggalakkan anda untuk bersungguh-sungguh, menetapkan standard yang tinggi dan mengharapkan kualiti yang tinggi, penguatkuasaan skema melakukan apa yang sepatutnya dilakukan—membantu anda mengekalkan integriti dan memastikan meja anda bersih.
Jika setelah pertimbangan selanjutnya anda memutuskan bahawa anda benar-benar melakukannya perlu Menambah lajur baharu tiada masalah; pembetulan satu baris disediakan di bawah. Penyelesaiannya ialah evolusi skema!
Apakah evolusi skema?
Evolusi skema ialah ciri yang membolehkan pengguna mengubah suai skema semasa jadual dengan mudah untuk menampung perubahan data dari semasa ke semasa. Ia paling biasa digunakan semasa operasi sisip atau tulis semula untuk menyesuaikan skema secara automatik untuk memasukkan satu atau lebih lajur baharu.
Bagaimanakah evolusi skema berfungsi?
Mengikuti contoh daripada bahagian sebelumnya, pembangun boleh menggunakan evolusi skema dengan mudah untuk menambah lajur baharu yang sebelum ini ditolak kerana ketidakpatuhan skema. Evolusi skema diaktifkan dengan menambah .option('mergeSchema', 'true') kepada pasukan Spark anda .write или .writeStream.
# Добавьте параметр mergeSchema
loans.write.format("delta")
.option("mergeSchema", "true")
.mode("append")
.save(DELTALAKE_SILVER_PATH)Untuk melihat graf, jalankan pertanyaan 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 
Sebagai alternatif, anda boleh menetapkan pilihan ini untuk keseluruhan sesi Spark dengan menambah spark.databricks.delta.schema.autoMerge = True ke dalam konfigurasi Spark. Walau bagaimanapun, gunakan ini dengan berhati-hati, kerana penguatkuasaan skema tidak lagi akan memberi amaran kepada anda tentang ketidakkonsistenan skema yang tidak disengajakan.
Dengan memasukkan parameter dalam permintaan mergeSchemaSemua lajur yang terdapat dalam DataFrame tetapi tiada daripada jadual sasaran dilampirkan secara automatik pada skema semasa transaksi tulis. Medan bersarang juga boleh ditambah dan ia juga akan dilampirkan pada lajur yang sepadan dalam struktur.
Jurutera data dan saintis boleh menggunakan pilihan ini untuk menambah lajur baharu (mungkin metrik yang dijejaki baru-baru ini atau lajur angka jualan untuk bulan ini) pada jadual pengeluaran pembelajaran mesin sedia ada mereka tanpa memecahkan model sedia ada berdasarkan lajur lama.
Jenis perubahan skema berikut dibenarkan sebagai sebahagian daripada evolusi skema semasa memasukkan atau menulis semula jadual:
- Menambah lajur baharu (ini ialah senario yang paling biasa)
- Menukar jenis data daripada NullType -> sebarang jenis lain atau mempromosikan daripada ByteType -> ShortType -> IntegerType
Perubahan lain yang tidak dibenarkan dalam evolusi skema memerlukan skema dan data ditimpa dengan menambah .option("overwriteSchema", "true")Contohnya, jika lajur "Foo" pada asalnya ialah integer dan skema baharu ialah jenis data rentetan, maka semua fail Parket (data) perlu ditulis semula. Perubahan tersebut termasuk:
- memadamkan lajur
- menukar jenis data lajur sedia ada (di tempat)
- menamakan semula lajur yang berbeza hanya dalam kes (mis. "Foo" dan "foo")
Akhir sekali, dengan keluaran seterusnya, Spark 3.0, DDL eksplisit (menggunakan ALTER TABLE) akan disokong sepenuhnya, membolehkan pengguna melakukan tindakan berikut pada skema jadual:
- menambah lajur
- menukar komen lajur
- Menetapkan sifat jadual yang menentukan tingkah laku jadual, seperti menetapkan tempoh pengekalan log transaksi.
Apakah faedah evolusi skema?
Evolusi skema boleh digunakan pada bila-bila masa anda adakah anda berniat untuk Tukar skema jadual anda (berbanding dengan menambahkan lajur secara tidak sengaja pada DataFrame anda yang tidak sepatutnya ada). Ini ialah cara paling mudah untuk memindahkan skema anda kerana ia secara automatik menambahkan nama lajur dan jenis data yang betul tanpa perlu mengisytiharkannya secara eksplisit.
Kesimpulan
Penguatkuasaan skema menolak sebarang lajur baharu atau perubahan skema lain yang tidak serasi dengan jadual anda. Dengan menetapkan dan mengekalkan piawaian tinggi ini, penganalisis dan jurutera boleh yakin bahawa data mereka mempunyai tahap integriti tertinggi, membuat alasan mengenainya dengan jelas dan padat, membolehkan mereka membuat keputusan perniagaan yang lebih berkesan.
Sebaliknya, evolusi skim melengkapkan penguatkuasaan dengan memudahkan didakwa Perubahan skema automatik. Lagipun, menambah lajur tidak sepatutnya sukar.
Penguatkuasaan litar ialah yang kepada yin evolusi litar. Digunakan bersama, ciri ini menjadikan penindasan hingar dan penalaan isyarat lebih mudah berbanding sebelum ini.
Kami juga ingin mengucapkan terima kasih kepada Mukul Murthy dan Pranav Anand atas sumbangan mereka kepada artikel ini.
Artikel lain dalam siri ini:

Artikel berkaitan
Sumber: www.habr.com
