Taucht an Delta Lake: Schema Duerchféierung an Evolutioun

Hey Habr! Ech presentéieren Iech d'Iwwersetzung vum Artikel "Diving Into Delta Lake: Schema Enforcement & Evolution" Auteuren Burak Yavuz, Brenner Heintz an Denny Lee, déi virbereet gouf op den Ufank vum Cours Daten Ingenieur vun OTUS.

Taucht an Delta Lake: Schema Duerchféierung an Evolutioun

Daten, wéi eis Erfarung, accumuléieren an evoluéieren dauernd. Fir matzemaachen, mussen eis mental Modeller vun der Welt un nei Donnéeën upassen, e puer vun deenen nei Dimensiounen enthalen - nei Weeër fir Saachen ze observéieren, iwwer déi mir virdrun keng Ahnung haten. Dës mental Modeller sinn net vill anescht wéi d'Tabell Schemaen déi definéieren wéi mir nei Informatioun klassifizéieren a veraarbecht.

Dëst bréngt eis op d'Fro vum Schemamanagement. Wéi d'Geschäftsziler an Ufuerderunge mat der Zäit änneren, sou ännert d'Struktur vun Ären Donnéeën. Delta Lake mécht et einfach nei Miessunge ëmzesetzen wéi Daten änneren. D'Benotzer hunn Zougang zu einfacher Semantik fir hir Tabelleschemaen ze managen. Dës Tools beinhalt d'Schema Enforcement, déi d'Benotzer schützt fir hir Dëscher onbedéngt mat Feeler oder onnéideg Donnéeën ze verschmotzen, a Schema Evolution, déi et erlaabt datt nei Saile vu wäertvollen Donnéeën automatesch op de passenden Plazen derbäigesat ginn. An dësem Artikel wäerte mir d'Benotzung vun dësen Tools verdéiwen.

Dësch Schema verstoen

All DataFrame am Apache Spark enthält e Schema dat d'Form vun den Donnéeën definéiert wéi Datentypen, Kolonnen a Metadaten. Mam Delta Lake gëtt den Dëschschema am JSON-Format am Transaktiounslog gelagert.

Wat ass Schema Enforcement?

Schema Enforcement, och bekannt als Schema Validation, ass e Schutzmechanismus am Delta Lake, deen d'Datequalitéit garantéiert andeems Dir records refuséiert, déi net dem Dëschschema passen. Wéi eng Hostess an der Receptioun vun engem populäre Restaurant, deen nëmme Reservatiounen acceptéiert, iwwerpréift hie fir ze kucken, ob all Kolonn vun Daten, déi an den Dësch aginn sinn, an der entspriechender Lëscht vun erwaarte Spalten ass (an anere Wierder, wann et eng "Buchung" gëtt fir jiddereng vun hinnen), a refuséiert all Entréen mat Spalten net an der Lëscht.

Wéi funktionéiert Schema Duerchféierung?

Delta Lake benotzt Schema Validatioun op Schreiwen, dat heescht, datt all nei Schreiwen un den Dësch fir Onbedenklechkeet mat der Zil- Dësch Schema bei Schreiwen Zäit gepréift ginn. Wann de Schema inkonsistent ass, dréit Delta Lake d'Transaktioun komplett ëm (keng Daten ginn geschriwwe) a werft eng Ausnam fir de Benotzer vun der Inkonsistenz z'informéieren.
Delta Lake benotzt déi folgend Regelen fir ze bestëmmen ob e Rekord mat engem Dësch kompatibel ass. Geschriwwen DataFrame:

  • kënnen net zousätzlech Kolonnen enthalen déi net am Schema vun der Ziltabelle sinn. Ëmgekéiert ass alles gutt wann déi erakommen Donnéeën net absolut all d'Säulen aus der Tabell enthalen - dës Kolonnen ginn einfach null Wäerter zougewisen.
  • kann net Spaltdatentypen hunn, déi anescht sinn wéi d'Kolonndatentypen an der Ziltabelle. Wann eng Kolonn an der Ziltabelle StringType Daten enthält, awer déi entspriechend Kolonn am DataFrame enthält IntegerType Daten, Schema Duerchféierung wäert eng Ausnam werfen a verhënneren datt d'Schreifoperatioun stattfënnt.
  • kann net Spaltennimm enthalen déi nëmmen am Fall ënnerscheeden. Dëst bedeit datt Dir d'Saile mam Numm 'Foo' an 'foo' net an der selwechter Tabell definéiert hutt. Iwwerdeems Spark kann am Fall-sensibel oder case-onsensitiv (de Standard) Modus benotzt ginn, Delta Lake ass case-konservéiert awer onsensibel bannent Schemalagerung. Parquet ass Fall sensibel wann Dir Spaltinformatioun späichert an zréckkënnt. Fir méiglech Feeler, Datekorruptioun oder Dateverloscht ze vermeiden (wat mir perséinlech an Databricks erlieft hunn), hu mir décidéiert dës Begrenzung derbäi ze ginn.

Fir dëst ze illustréieren, loosst eis kucken wat am Code hei ënnen geschitt wann Dir probéiert e puer nei generéiert Kolonnen op eng Delta Lake Dësch ze addéieren deen nach net konfiguréiert ass fir se ze akzeptéieren.

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

Amplaz automatesch nei Sailen derbäi ze ginn, setzt Delta Lake e Schema duerch a stoppt opzehuelen. Fir ze hëllefen ze bestëmmen wéi eng Kolonn (oder Set vun hinnen) de Mëssverständnis verursaacht, spréngt Spark béid Schemaen aus dem Spuerstack fir de Verglach.

Wat ass de Virdeel vun der Schema Duerchféierung?

Zënter Schema Duerchféierung ass e zimlech rigoréise Scheck, et ass e super Tool fir als Gatekeeper vun enger propperer, komplett transforméierter Dataset ze benotzen déi prett ass fir produzéiert oder verbraucht ze ginn. Typesch applizéiert op Dëscher déi Daten direkt fidderen:

  • Maschinn Léieren Algorithmen
  • BI Dashboards
  • Datenanalyse a Visualiséierungsinstrumenter
  • All Produktiounssystem deen héich strukturéiert, staark getippten semantesch Schemaen erfuerdert.

Fir hir Donnéeën op dës lescht Hürd virzebereeden, benotze vill Benotzer eng einfach "Multi-Hop" Architektur déi graduell Struktur an hir Dëscher agefouert. Fir méi iwwer dëst ze léieren, kënnt Dir den Artikel liesen Produktiounsgrad Maschinn Léieren mat Delta Lake.

Natierlech kann d'Schema Duerchféierung iwwerall an Ärer Pipeline benotzt ginn, awer bedenkt datt Streaming Schreiwen op en Dësch an dësem Fall frustréierend ka sinn, well Dir zum Beispill vergiess hutt datt Dir eng aner Kolonn un déi erakommen Donnéeën bäigefüügt hutt.

Donnéeën thinning Préventioun

Zu dësem Zäitpunkt kënnt Dir Iech froen firwat den Hype? Iwwerhaapt, heiansdo kann en onerwaarte "Schema-Mëssmatch" Feeler Iech an Ärem Workflow opreegen, besonnesch wann Dir nei sidd am Delta Lake. Firwat net just d'Schema änneren wéi néideg sou datt ech mäi DataFrame egal wat schreiwen kann?

Wéi déi al Spréchwuert seet: "Eng Unze vu Präventioun ass e Pound vun der Kur wäert." Irgendwann, wann Dir Iech net këmmert fir Äert Schema ëmzesetzen, wäerten d'Datentyp Kompatibilitéitsprobleemer hiren ellene Kapp ophalen - anscheinend homogen raw Datequellen kënnen Randfäegkeeten, gebrochene Sailen, falsch geformte Mappingen, oder aner gefaart Saachen iwwer déi Dir dreemt. an Nightmares. Déi bescht Approche ass dës Feinde um Paart ze stoppen - mat Schema Duerchféierung - a mat hinnen am Liicht ëmzegoen, net méi spéit wann se ufänken déi donkel Tiefe vun Ärem Produktiounscode ze prowling.

Schema Duerchféierung gëtt Iech d'Vertrauen datt d'Schema vun Ärem Dësch net ännert ausser Dir d'Ännerung selwer confirméiert. Dëst verhënnert d'Verdünnung vun Daten, déi ka geschéien wann nei Sailen sou dacks bäigefüügt ginn, datt virdru wäertvoll, kompriméiert Dëscher hire Wäert an d'Nëtzlechkeet verléieren wéinst Dateniwwerschwemmungen. Andeems Dir Iech encouragéiert fir virsiichteg ze sinn, héich Standarden ze setzen an héich Qualitéit ze erwaarden, mécht d'Schema Duerchféierung genee wat et entworf gouf fir ze maachen - hëlleft Iech gewëssenhaft ze bleiwen an Är Spreadsheets propper ze halen.

Wann, op weider Iwwerleeung, Dir decidéiert, datt Dir wierklech braucht eng nei Kolonn fügen - kee Problem, hei drënner ass eng One-Line Fix. D'Léisung ass Circuit Evolutioun!

Wat ass Schema Evolutioun?

Schema Evolutioun ass eng Feature déi d'Benotzer erlaabt den aktuellen Schema vun enger Tabell einfach z'änneren fir Daten ze passen déi sech mat der Zäit änneren. Et gëtt meeschtens benotzt wann Dir eng Add- oder Iwwerschreiwe-Operatioun ausféiert fir de Schema automatesch unzepassen fir eng oder méi nei Kolonnen ze enthalen.

Wéi funktionéiert Schema Evolutioun?

No dem Beispill an der viregter Sektioun kënnen d'Entwéckler d'Schema Evolutioun einfach benotze fir nei Spalten ze addéieren déi virdru refuséiert goufen wéinst Schema Inkonsistenz. Circuit Evolutioun gëtt aktivéiert andeems se derbäigesat ginn .option('mergeSchema', 'true') op Är Spark Team .write или .writeStream.

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

Fir d'Grafik ze gesinn, fuert déi folgend Spark SQL Ufro

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

Taucht an Delta Lake: Schema Duerchféierung an Evolutioun
Alternativ kënnt Dir dës Optioun fir déi ganz Spark Sessioun setzen andeems Dir bäidréit spark.databricks.delta.schema.autoMerge = True an d'Spark Konfiguratioun. Awer benotzt dëst mat Vorsicht, well Schema Duerchféierung wäert Iech net méi iwwer ongewollt Schema Inkonsistenz warnen.

Andeems Dir e Parameter an der Ufro enthält mergeSchema, all Spalten, déi am DataFrame präsent sinn, awer net an der Ziltabelle präsent sinn, ginn automatesch um Enn vum Schema als Deel vun der Schreiftransaktioun bäigefüügt. Nestéiert Felder kënnen och bäigefüügt ginn, an dës ginn och op d'Enn vun den entspriechende Strukturkolonnen bäigefüügt.

Datumingenieuren an Datewëssenschaftler kënnen dës Optioun benotze fir nei Sailen ze addéieren (vläicht eng kierzlech verfollegt Metrik oder d'Verkafszuele vun dësem Mount) op hir existent Maschinnléiere Produktiounstabellen ouni existent Modeller op Basis vun den alen Sailen ze briechen.

Déi folgend Aarte vu Schema Ännerungen sinn erlaabt als Deel vun enger Schema Evolutioun wärend Dir eng Tabell derbäigesat oder iwwerschreift:

  • Nei Kolonnen derbäisetzen (dëst ass deen heefegste Szenario)
  • Datentypen vun NullType änneren -> all aner Zort oder Promotioun vum ByteType -> ShortType -> IntegerType

Aner Ännerungen, déi net als Deel vun der Schema Evolutioun erlaabt sinn, erfuerderen datt de Schema an d'Donnéeën iwwerschriwwe ginn andeems se derbäigesat ginn .option("overwriteSchema", "true"). Zum Beispill, am Fall wou d'Kolonn "Foo" ursprénglech eng ganz Zuel war an den neie Schema wier e Stringdatentyp, da missten all Parquet(Daten) Dateien iwwerschriwwe ginn. Dës Ännerungen enthalen:

  • eng Kolonn läschen
  • d'Datentyp vun enger existéierender Kolonn änneren (op der Plaz)
  • Spalten ëmbenennen déi nëmmen am Fall ënnerscheeden (zum Beispill "Foo" an "foo")

Endlech, mat der nächster Verëffentlechung vu Spark 3.0, gëtt explizit DDL (benotzt ALTER TABLE) voll ënnerstëtzt, wat d'Benotzer erlaabt déi folgend Aktiounen op Tabellschemaen auszeféieren:

  • derbäi Sailen
  • änneren Kolonn Kommentaren
  • Tabelleeigenschaften astellen, déi bestëmmen wéi den Dësch sech behält, wéi z.

Wat ass de Virdeel vun der Schema Evolutioun?

Schematesch Evolutioun kann benotzt ginn wann Dir wëlles Ännert de Schema vun Ärem Dësch (am Géigesaz zu wann Dir zoufälleg Spalten an Ärem DataFrame bäigefüügt hutt, déi net do solle sinn). Dëst ass deen einfachste Wee fir Äert Schema ze migréieren well et automatesch déi richteg Kolonnennimm an Datentypen bäidréit ouni se explizit ze deklaréieren.

Konklusioun

Schema Duerchféierung refuséiert all nei Kolonnen oder aner Schema Ännerungen déi net mat Ärem Dësch kompatibel sinn. Andeems Dir dës héich Standarden setzt an erhalen, kënnen Analysten an Ingenieuren op hir Donnéeën vertrauen fir den héchsten Niveau vun der Integritéit ze hunn, kloer a präzis doriwwer ze argumentéieren, wat hinnen erlaabt besser Geschäftsentscheedungen ze treffen.

Op der anerer Säit ergänzt d'Schema Evolutioun d'Ëmsetzung andeems se vereinfacht ugeholl automatesch Schema Ännerungen. Et sollt schliisslech net schwéier sinn eng Kolonn derbäizesetzen.

Schema Duerchféierung ass Yang, wou Schema Evolutiounen Yin sinn. Wann se zesumme benotzt ginn, maachen dës Features Geräischerreduktioun a Signaltuning méi einfach wéi jee.

Mir wëllen och dem Mukul Murthy a Pranav Anand Merci soen fir hir Bäiträg zu dësem Artikel.

Aner Artikelen an dëser Serie:

Taucht an Delta Lake: auspacken den Transaktiounsprotokoll

Verbonnen Artikelen

Produktiounsgrad Maschinn Léieren mat Delta Lake

Wat ass en daten Séi?

Léiert méi iwwer de Cours

Source: will.com

Setzt e Commentaire