Dûk yn Delta Lake: Skema hanthavenjen en evolúsje

Hoi Habr! Ik presintearje jo oandacht de oersetting fan it artikel "Dûke yn Delta Lake: Schema Enforcement & Evolution" skriuwers Burak Yavuz, Brenner Heintz en Denny Lee, dy't waard taret yn ôfwachting fan it begjin fan 'e kursus Data Engineer fan OTUS.

Dûk yn Delta Lake: Skema hanthavenjen en evolúsje

Gegevens, lykas ús ûnderfining, accumulearje en ûntwikkelje konstant. Om by te hâlden, moatte ús mentale modellen fan 'e wrâld oanpasse oan nije gegevens, wêrfan guon nije dimensjes befetsje - nije manieren om dingen te observearjen wêr't wy earder gjin idee oer hienen. Dizze mentale modellen binne net folle oars fan 'e tabelskema's dy't beskiede hoe't wy nije ynformaasje kategorisearje en ferwurkje.

Dit bringt ús by it probleem fan skemabehear. As bedriuwsdoelen en easken feroarje oer de tiid, feroaret de struktuer fan jo gegevens ek. Delta Lake makket it maklik om nije mjittingen út te fieren as gegevens feroarje. Brûkers hawwe tagong ta ienfâldige semantyk om har tabelskema's te behearjen. Dizze ark omfetsje Schema Enforcement, dy't brûkers beskermet fan ûnbedoeld fersmoarging fan har tabellen mei flaters of ûnnedige gegevens, en Schema Evolution, wêrtroch nije kolommen fan weardefolle gegevens automatysk kinne wurde tafoege op 'e passende plakken. Yn dit artikel sille wy yngean op it gebrûk fan dizze ark.

Tafelskema's begripe

Elk DataFrame yn Apache Spark befettet in skema dat de foarm fan de gegevens definiearret, lykas gegevenstypen, kolommen en metadata. Mei Delta Lake wurdt it tabelskema opslein yn JSON-formaat binnen it transaksjelogboek.

Wat is Schema Enforcement?

Schema Enforcement, ek bekend as Schema Validation, is in beskerming meganisme yn Delta Lake dat garandearret gegevens kwaliteit troch it ôfwizen fan records dy't net oerien mei de tabel skema. Lykas in gastfrou by de resepsje fan in populêr restaurant dat allinich reservearrings akseptearret, kontrolearret hy oft elke kolom mei gegevens dy't yn 'e tabel ynfierd is yn' e oerienkommende list mei ferwachte kolommen (mei oare wurden, as der in "boeking" is foar elk fan harren), en fersmyt alle yngongen mei kolommen net yn 'e list.

Hoe wurket skema hanthavenjen?

Delta Lake brûkt skema-validaasje by skriuwen, wat betsjut dat alle nije skriuwingen nei de tabel wurde kontrolearre op kompatibiliteit mei it skema fan 'e doeltabel op' e skriuwtiid. As it skema inkonsistint is, keart Delta Lake de transaksje folslein om (gjin gegevens wurde skreaun) en smyt in útsûndering om de brûker te ynformearjen oer de ynkonsistinsje.
Delta Lake brûkt de folgjende regels om te bepalen oft in rekord ferienichber is mei in tabel. Skreaun DataFrame:

  • kin gjin ekstra kolommen befetsje dy't net yn it skema fan 'e doeltabel binne. Oarsom is alles goed as de ynkommende gegevens net hielendal alle kolommen út 'e tabel befetsje - dizze kolommen sille gewoan nulwearden wurde tawiisd.
  • kin gjin kolomgegevenstypen hawwe dy't ferskille fan 'e kolomgegevenstypen yn 'e doeltabel. As in kolom yn 'e doeltabel befettet StringType-gegevens, mar de oerienkommende kolom yn' e DataFrame befettet IntegerType-gegevens, sil skema-hanthavening in útsûndering smite en foarkomme dat de skriuwoperaasje plakfynt.
  • kin gjin kolomnammen befetsje dy't allinich yn gefal ferskille. Dit betsjut dat jo gjin kolommen mei de namme 'Foo' en 'foo' kinne definieare yn deselde tabel. Wylst Spark kin wurde brûkt yn case-sensitive of case-ûngefoelige (de standert) modus, Delta Lake is case-behâldend, mar ûngefoelich binnen skema-opslach. Parket is haadlettergefoelich by it opslaan en weromjaan fan kolomynformaasje. Om mooglike flaters, gegevenskorrupsje of gegevensferlies te foarkommen (dy't wy persoanlik hawwe ûnderfûn yn Databricks), besletten wy dizze beheining ta te foegjen.

Om dit te yllustrearjen, litte wy ris sjen wat der bart yn 'e koade hjirûnder as jo besykje wat nij oanmakke kolommen ta te foegjen oan in Delta Lake-tabel dy't noch net is konfigureare om se te akseptearjen.

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

Yn stee fan automatysk nije kolommen ta te foegjen, hanthavenet Delta Lake in skema en stopet opnimmen. Om te helpen te bepalen hokker kolom (of set fan kolommen) de mismatch feroarsaket, popt Spark beide skema's út 'e spoarstapel foar ferliking.

Wat is it foardiel fan skema hanthavenjen?

Sûnt skema hanthavenjen is in frij strang kontrôle, it is in geweldich ark om te brûken as poartewachter fan in skjinne, folslein omfoarme dataset dy't klear is om te produsearjen of konsumearre. Typysk tapast op tabellen dy't gegevens direkt fiede:

  • Masine learen algoritmen
  • BI dashboards
  • Data analytics en fisualisaasje ark
  • Elk produksjesysteem dat tige strukturearre, sterk typearre semantyske skema's fereasket.

Om har gegevens foar dizze lêste hindernis ta te rieden, brûke in protte brûkers in ienfâldige "multi-hop" arsjitektuer dy't stadichoan struktuer yn har tabellen yntrodusearret. Om mear te learen oer dit, kinne jo it artikel lêze Masine learen fan produksjeklasse mei Delta Lake.

Fansels kin skema-hanthavening oeral yn jo pipeline brûkt wurde, mar hâld der rekken mei dat it streamen fan skriuwen nei in tabel yn dit gefal frustrerend kin wêze, om't jo bygelyks fergetten hawwe dat jo in oare kolom tafoege hawwe oan de ynkommende gegevens.

Previnsje fan gegevensútdunning

Tsjin dit punt freegje jo jo miskien ôf wêrom de hype? Ommers, soms kin in ûnferwachte "skema-mismatch"-flater jo opstekke yn jo workflow, foaral as jo nij binne by Delta Lake. Wêrom net gewoan it skema feroarje as nedich, sadat ik myn DataFrame kin skriuwe, wat dan ek?

As it âlde sprekwurd seit, "In ounce fan previnsje is in pûn fan genêzen wurdich." Op in stuit, as jo net soargje foar it hanthavenjen fan jo skema, sille problemen mei kompatibiliteit fan gegevenstype har ûnsjogge koppen ophelje - skynber homogene rauwe gegevensboarnen kinne rânegefallen, brutsen kolommen, misfoarme mappings, of oare freze dingen wêr't jo oer dreame kinne befetsje yn nachtmerjes. De bêste oanpak is om dizze fijannen by de poarte te stopjen - mei skema hanthavenjen - en omgean mei har yn it ljocht, net letter as se begjinne te prowling de tsjustere djipten fan jo produksje koade.

Skema-hanthavening jout jo it fertrouwen dat it skema fan jo tabel net feroaret, útsein as jo de wiziging sels befêstigje. Dit foarkomt gegevensverdunning dy't foarkomme kinne as nije kolommen sa faak tafoege wurde dat earder weardefolle, komprimearre tabellen har wearde en brûkberens ferlieze troch gegevensoerstreaming. Troch jo oan te moedigjen om opsetlik te wêzen, hege noarmen yn te stellen en hege kwaliteit te ferwachtsjen, docht skema-hanthavening krekt wat it is ûntwurpen om te dwaan - helpt jo gewisse te bliuwen en jo spreadsheets skjin te hâlden.

As, nei fierdere ôfwaging, jo beslute dat jo echt nedich foegje in nije kolom ta - gjin probleem, hjirûnder is in ien-line fix. De oplossing is circuit evolúsje!

Wat is skema-evolúsje?

Skema-evolúsje is in funksje wêrmei brûkers maklik it aktuele skema fan in tabel kinne feroarje om oerien te kommen mei gegevens dy't oer de tiid feroarje. It wurdt meast brûkt by it útfieren fan in add- of oerskriuwoperaasje om it skema automatysk oan te passen om ien of mear nije kolommen op te nimmen.

Hoe wurket skema-evolúsje?

Nei it foarbyld yn 'e foarige seksje kinne ûntwikkelders maklik skema-evolúsje brûke om nije kolommen ta te foegjen dy't earder waarden ôfwiisd fanwegen skema-ynkonsistinsje. Circuit evolúsje wurdt aktivearre troch tafoegjen .option('mergeSchema', 'true') nei jo Spark-team .write или .writeStream.

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

Om de grafyk te besjen, útfiere de folgjende Spark SQL-query

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

Dûk yn Delta Lake: Skema hanthavenjen en evolúsje
As alternatyf kinne jo dizze opsje ynstelle foar de heule Spark-sesje troch ta te foegjen spark.databricks.delta.schema.autoMerge = True nei de Spark-konfiguraasje. Mar brûk dit mei foarsichtigens, om't skema-hanthavening jo net langer warskôgje sil oer ûnbedoelde skema-ynkonsistinsjes.

Troch in parameter yn it fersyk op te nimmen mergeSchema, Alle kolommen dy't oanwêzich binne yn it DataFrame, mar net oanwêzich yn 'e doeltabel, wurde automatysk tafoege oan' e ein fan it skema as ûnderdiel fan 'e skriuwtransaksje. Nested fjilden kinne ek wurde tafoege, en dizze sille ek wurde tafoege oan 'e ein fan' e oerienkommende struktuer kolommen.

Datum-yngenieurs en gegevenswittenskippers kinne dizze opsje brûke om nije kolommen ta te foegjen (miskien in koartlyn folge metryske as kolom fan ferkeapsifers fan dizze moanne) oan har besteande produksjetabellen foar masine learen sûnder besteande modellen te brekken basearre op 'e âlde kolommen.

De folgjende soarten skemawizigingen binne tastien as ûnderdiel fan in skema-evolúsje by it tafoegjen of oerskriuwen fan in tabel:

  • Nije kolommen tafoegje (dit is it meast foarkommende senario)
  • Gegevenstypen feroarje fan NullType -> elk oar type of promoasje fan ByteType -> ShortType -> IntegerType

Oare wizigingen dy't net tastien binne as ûnderdiel fan skema-evolúsje fereaskje dat it skema en gegevens wurde oerskreaun troch tafoeging .option("overwriteSchema", "true"). Bygelyks, yn it gefal dêr't de "Foo" kolom wie oarspronklik in hiel getal en it nije skema soe wêze in string gegevens type, dan alle Parquet (data) triemmen moatte wurde oerskreaun. Dizze wizigingen omfetsje:

  • in kolom wiskje
  • feroarjen fan it gegevenstype fan in besteande kolom (yn plak)
  • kolommen omneame dy't allinich ferskille yn gefal (bygelyks "Foo" en "foo")

Uteinlik, mei de folgjende release fan Spark 3.0, sil eksplisite DDL (mei ALTER TABLE) folslein stipe wurde, wêrtroch brûkers de folgjende aksjes kinne útfiere op tabelskema's:

  • it tafoegjen fan kolommen
  • feroarjende kolom comments
  • it ynstellen fan tabel eigenskippen dy't bepale hoe't de tabel gedraacht, lykas ynstellen hoe lang it transaksje log wurdt bewarre.

Wat is it foardiel fan skema-evolúsje?

Skematyske evolúsje kin brûkt wurde as jo fan doel feroarje it skema fan jo tabel (yn tsjinstelling ta wannear't jo per ongeluk kolommen tafoege oan jo DataFrame dy't der net moatte wêze). Dit is de maklikste manier om jo skema te migrearjen, om't it automatysk de juste kolomnammen en gegevenstypen tafoeget sûnder se eksplisyt te ferklearjen.

konklúzje

Skema hanthavening wegeret alle nije kolommen of oare skema feroarings dy't net kompatibel mei jo tabel. Troch dizze hege noarmen yn te stellen en te ûnderhâlden, kinne analisten en yngenieurs fertrouwe op har gegevens om it heechste nivo fan yntegriteit te hawwen, dúdlik en bondich deroer redenearje, sadat se bettere saaklike besluten kinne nimme.

Oan 'e oare kant komplementeart skema-evolúsje de hanthavening troch te ferienfâldigjen fermoedlik automatyske skema feroarings. It soe ommers net dreech wêze moatte om in kolom ta te foegjen.

Skema hanthavening is yang, dêr't skema evolúsjes binne yin. As tegearre brûkt, meitsje dizze funksjes lûdreduksje en sinjaalôfstimming makliker dan ea.

Wy wolle ek Mukul Murthy en Pranav Anand betankje foar har bydragen oan dit artikel.

Oare artikels yn dizze searje:

Delta Lake Dive: it transaksjelog útpakke

Ferlykbere artikels

Masine learen fan produksjeklasse mei Delta Lake

Wat is in datamar?

Learje mear oer de kursus

Boarne: www.habr.com

Add a comment