Teuleum ka Tasik Delta: Penegak Skema sareng Évolusi

Héy Habr! Kuring nampilkeun ka perhatian anjeun tarjamahan artikel "Nyilem Ka Tasik Delta: Penegak Skema & Évolusi" pangarang Burak Yavuz, Brenner Heintz sareng Denny Lee, anu disiapkeun dina antisipasi mimiti kursus "Insinyur Data" ti OTUS.

Teuleum ka Tasik Delta: Penegak Skema sareng Évolusi

Data, sapertos pangalaman urang, terus-terusan ngumpulkeun sareng mekar. Pikeun tetep nepi, model mental urang dunya kudu adaptasi jeung data anyar, sababaraha nu ngandung dimensi anyar-cara anyar observasi hal urang teu boga pamanggih ngeunaan saméméhna. Modél mental ieu teu jauh béda ti skéma tabel nu nangtukeun kumaha urang ngagolongkeun jeung ngolah informasi anyar.

Ieu brings kami ka masalah manajemén schema. Salaku tantangan bisnis jeung sarat robah kana waktu, kitu ogé struktur data anjeun. Delta Lake ngagampangkeun pikeun ngenalkeun pangukuran énggal nalika parobihan data. Pamaké miboga aksés ka semantik basajan pikeun ngatur schemas tabel maranéhanana. Alat-alat ieu kalebet Schema Enforcement, anu ngajagi pangguna tina ngahaja ngotoran tabelna ku kasalahan atanapi data anu teu dipikabutuh, sareng Schema Evolution, anu ngamungkinkeun kolom data berharga anyar sacara otomatis ditambahkeun kana lokasi anu pas. Dina artikel ieu, urang bakal teuleum deeper kana ngagunakeun parabot ieu.

Pamahaman Table Schemas

Unggal DataFrame dina Apache Spark ngandung skéma anu netepkeun bentuk data, sapertos jinis data, kolom, sareng metadata. Kalayan Delta Lake, skéma méja disimpen dina format JSON di jero log transaksi.

Naon panerapan skéma?

Schema Enforcement, ogé katelah Schema Validation, mangrupikeun mékanisme kaamanan di Delta Lake anu mastikeun kualitas data ku cara nampik rékaman anu henteu cocog sareng skéma méja. Sapertos nyonya rumah di meja payun réstoran ngan ukur anu populér, anjeunna mariksa naha unggal kolom data anu diasupkeun kana tabél aya dina daptar kolom anu dipiharep (dina basa sanés, naha aya "reservasi" pikeun masing-masingna. ), sareng nampik rékaman anu aya kolom anu teu aya dina daptar.

Kumaha schema enforcement jalan?

Delta Lake ngagunakeun schema-on-write mariksa, nu hartina sakabéh nulis anyar kana tabél dipariksa pikeun kasaluyuan jeung schema tabel target dina waktu nulis. Mun schema nyaeta inconsistent, Delta Lake aborts urus sagemblengna (euweuh data ditulis) sarta raises iwal mun ngabéjaan pamaké ngeunaan inconsistency nu.
Delta Lake ngagunakeun aturan di handap pikeun nangtukeun naha rékaman kompatibel jeung méja. DataFrame Bisa Ditulis:

  • teu bisa ngandung kolom tambahan nu teu aya dina skéma tabel target urang. Sabalikna, sadayana henteu kunanaon upami data anu asup henteu ngandung leres pisan sadaya kolom tina tabél - kolom ieu ngan saukur ditugaskeun nilai null.
  • teu bisa boga tipe data kolom nu béda ti tipe data kolom dina tabel target. Lamun kolom tabel target ngandung data StringType, tapi kolom pakait dina DataFrame ngandung data IntegerType, schema penegak bakal buang iwal jeung nyegah operasi nulis ti lumangsung.
  • teu bisa ngandung ngaran kolom nu béda ngan bisi. Ieu ngandung harti yén anjeun teu bisa boga kolom ngaranna 'Foo' sarta 'foo' dihartikeun dina tabel sarua. Nalika Spark tiasa dianggo dina modeu sénsitip atanapi case-insensitive (standar), Delta Lake ngawétkeun kasus tapi teu peka dina panyimpenan skéma. Parquet sénsitip kana kasus nalika nyimpen sareng ngabalikeun inpormasi kolom. Pikeun ngahindarkeun kamungkinan kasalahan, korupsi data, atanapi leungitna data (hal anu urang alami di Databricks), kami mutuskeun pikeun nambihan watesan ieu.

Pikeun ngagambarkeun ieu, hayu urang tingali naon anu lumangsung dina kode di handap nalika urang cobaan pikeun nambahkeun sababaraha kolom karek dihasilkeun kana tabel Delta Lake nu teu acan ngonpigurasi pikeun nampa aranjeunna.

# Сгенерируем 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.

Gantina otomatis nambahkeun kolom anyar, Delta Lake maksakeun skéma sarta eureun nulis. Pikeun mantuan nangtukeun mana kolom (atawa susunan kolom) ngabalukarkeun bédana éta, Spark kaluaran duanana schemas tina renik tumpukan pikeun babandingan.

Naon mangpaatna ngalaksanakeun skéma?

Kusabab penegak skéma nyaéta cek anu cukup ketat, éta mangrupikeun alat anu saé pikeun dianggo salaku gatekeeper ka set data anu bersih, dirobih lengkep anu siap pikeun produksi atanapi konsumsi. Ilaharna diterapkeun kana tabel anu langsung nyayogikeun data:

  • Algoritma pembelajaran mesin
  • dasbor BI
  • Data analytics sareng alat visualisasi
  • Sistem produksi naon waé anu peryogi skéma semantis anu terstruktur, diketik kuat.

Nyiapkeun data maranéhanana pikeun halangan final ieu, loba pamaké ngagunakeun basajan "multi-hop" arsitéktur nu laun ngenalkeun struktur kana tabel maranéhanana. Pikeun leuwih jéntré ngeunaan ieu, anjeun tiasa pariksa kaluar artikel Pembelajaran mesin kelas produksi sareng Delta Lake.

Tangtosna, penegak skéma tiasa dianggo dimana waé dina pipa anjeun, tapi émut yén ngalirkeun kana méja dina hal ieu tiasa ngaganggu sabab, contona, anjeun hilap yén anjeun nambihan kolom sanés kana data anu asup.

Nyegah éncér data

Ayeuna anjeun tiasa naroskeun, naon anu kaganggu? Barina ogé, kadang kasalahan "skema mismatch" anu teu kaduga tiasa nyababkeun anjeun dina alur kerja anjeun, khususna upami anjeun énggal ka Delta Lake. Naha henteu ngan ngantepkeun skéma anu robih upami diperyogikeun ku kituna kuring tiasa nyerat DataFrame kuring henteu paduli naon?

Salaku paribasa heubeul mana, "sahiji ons pencegahan patut pon tamba". Dina sababaraha waktos, upami anjeun henteu ati-ati ngalaksanakeun skéma anjeun, masalah kasaluyuan tipe data bakal nyababkeun sirah anu awon - sumber data atah anu sigana homogen tiasa ngandung kasus tepi, kolom anu rusak, pemetaan anu salah, atanapi hal-hal pikasieuneun anu sanés pikeun impian. ngimpina. Pendekatan anu pangsaéna nyaéta pikeun ngeureunkeun musuh-musuh ieu di gerbang - kalayan palaksanaan skema - sareng nungkulan aranjeunna dina terang, tinimbang engké nalika aranjeunna mimiti nyumput di jero poék kode produksi anjeun.

Ngalaksanakeun skéma masihan anjeun jaminan yén skéma méja anjeun moal robih upami anjeun nyatujuan parobahanana. Ieu nyegah éncér data, nu bisa lumangsung nalika kolom anyar ditambahkeun jadi remen nu saméméhna berharga, tabel dikomprés leungit harti jeung usefulness maranéhanana alatan inundation data. Ku ngadorong anjeun ngahaja, netepkeun standar anu luhur, sareng ngarepkeun kualitas luhur, penegak skéma ngalakukeun naon anu dirarancang pikeun dilakukeun-ngabantosan anjeun tetep ati-ati sareng hamparan anjeun beresih.

Lamun kana tinimbangan salajengna anjeun mutuskeun yén anjeun bener ngabutuhkeun nambahkeun kolom anyar - euweuh masalah, di handap mangrupa fix hiji-garis. Solusina nyaéta évolusi sirkuit!

Naon évolusi skéma?

Évolusi skéma nyaéta fitur anu ngamungkinkeun pamaké pikeun gampang ngarobah skéma tabel ayeuna nurutkeun data nu robah kana waktu. Hal ieu paling sering dianggo nalika ngalakukeun operasi append atanapi nyerat ulang pikeun otomatis adaptasi skéma pikeun ngalebetkeun hiji atanapi langkung kolom énggal.

Kumaha évolusi skéma dianggo?

Nuturkeun conto ti bagian saméméhna, pamekar bisa kalayan gampang ngagunakeun évolusi skéma pikeun nambahkeun kolom anyar nu saméméhna ditolak alatan inconsistency schema. Évolusi sirkuit diaktipkeun ku nambahkeun .option('mergeSchema', 'true') ka tim Spark Anjeun .write или .writeStream.

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

Pikeun ningali grafik, jalankeun paréntah Spark SQL di handap ieu

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

Teuleum ka Tasik Delta: Penegak Skema sareng Évolusi
Alternatipna, Anjeun bisa nyetel pilihan ieu pikeun sakabéh sési Spark ku nambahkeun spark.databricks.delta.schema.autoMerge = True kana konfigurasi Spark. Tapi anggo ieu kalayan ati-ati, sabab penegak skéma moal deui ngingetkeun anjeun kana inconsistencies skéma anu teu dihaja.

Ku kaasup parameter dina pamundut mergeSchema, Sadaya kolom anu aya dina DataFrame tapi henteu dina tabel target otomatis ditambahkeun kana tungtung schema salaku bagian tina transaksi nulis. Widang Nested ogé bisa ditambahkeun jeung ieu ogé bakal ditambahkeun kana tungtung kolom struktur pakait.

Insinyur tanggal sareng élmuwan data tiasa nganggo pilihan ieu pikeun nambihan kolom énggal (panginten métrik anu nembé dilacak atanapi kolom kinerja penjualan bulan ieu) kana tabel produksi diajar mesin anu tos aya tanpa ngarobih modél anu tos aya dumasar kana kolom anu lami.

Jenis parobahan skéma di handap ieu diidinan salaku bagian tina évolusi skéma salami tambihan tabel atanapi nyerat ulang:

  • Nambahkeun kolom anyar (ieu skenario anu paling umum)
  • Ngarobah tipe data tina NullType -> tipe séjén atawa promosi ti ByteType -> ShortType -> IntegerType

Parobahan sejenna teu diwenangkeun dina évolusi skéma merlukeun yén skéma jeung data ditulis ulang ku nambahkeun .option("overwriteSchema", "true"). Contona, dina kasus dimana kolom "Foo" asalna mangrupa integer jeung skéma anyar éta tipe data string, lajeng sadayana Parquet(data) file bakal perlu ditulis ulang. Parobihan sapertos kieu kalebet:

  • ngahapus kolom
  • ngarobah tipe data kolom nu aya (di-tempat)
  • ngaganti ngaran kolom nu béda ngan bisi (contona, "Foo" jeung "foo")

Tungtungna, sareng sékrési Spark 3.0 salajengna, DDL eksplisit bakal dirojong sapinuhna (nganggo ALTER TABLE), ngamungkinkeun para pangguna ngalaksanakeun tindakan di handap ieu dina skéma méja:

  • nambahkeun kolom
  • ngarobah komentar kolom
  • netepkeun sipat tabel nu ngadalikeun kabiasaan tabel urang, kayaning netepkeun lilana log urus disimpen.

Naon mangpaat évolusi sirkuit?

Évolusi skéma tiasa dianggo iraha waé anjeun ngahajakeun ngarobah skéma tabel anjeun (sabalikna mun anjeun ngahaja ditambahkeun kolom ka DataFrame anjeun nu teu kudu aya). Ieu mangrupikeun cara anu paling gampang pikeun migrasi skéma anjeun sabab sacara otomatis nambihan nami kolom sareng jinis data anu leres tanpa kedah nyatakeun sacara eksplisit.

kacindekan

Penegak skéma nolak kolom anyar atanapi parobahan skéma sanés anu henteu cocog sareng méja anjeun. Ku netepkeun sareng ngajaga standar anu luhur ieu, analis sareng insinyur tiasa percanten yén datana ngagaduhan tingkat integritas anu paling luhur, komunikasi sacara jelas sareng jelas, ngamungkinkeun aranjeunna nyandak kaputusan bisnis anu langkung saé.

Di sisi séjén, évolusi skéma complements penegak ku nyederhanakeun disangka parobahan skéma otomatis. Barina ogé, teu hese pikeun nambahkeun kolom.

Aplikasi dipaksa tina skéma nyaéta Yang, dimana évolusi skéma nyaéta yin. Lamun dipaké babarengan, fitur ieu ngajadikeun suprési noise sarta tuning sinyal leuwih gampang ti kantos.

Kami ogé hoyong hatur Mukul Murthy sareng Pranav Anand pikeun kontribusina pikeun tulisan ieu.

Artikel séjén dina séri ieu:

Teuleum ka Tasik Delta: Ngabongkar Log Transaksi

Tulisan Anu Patali

Pembelajaran mesin kelas produksi sareng Delta Lake

Naon ari danau data?

Pilarian langkung seueur ngeunaan kursus

sumber: www.habr.com

Tambahkeun komentar