Ponorte sa do jazera Delta: Presadzovanie schém a vývoj

Čau Habr! Do pozornosti dávam preklad článku „Potápanie do jazera Delta: Presadzovanie schémy a vývoj“ autorov Burak Yavuz, Brenner Heintz a Denny Lee, ktorý bol pripravený v očakávaní začiatku kurzu dátový inžinier od spoločnosti OTUS.

Ponorte sa do jazera Delta: Presadzovanie schém a vývoj

Dáta, rovnako ako naše skúsenosti, sa neustále hromadia a vyvíjajú. Aby sme udržali krok, naše mentálne modely sveta sa musia prispôsobiť novým údajom, z ktorých niektoré obsahujú nové dimenzie – nové spôsoby pozorovania vecí, o ktorých sme predtým ani netušili. Tieto mentálne modely sa príliš nelíšia od tabuľkových schém, ktoré určujú, ako kategorizujeme a spracovávame nové informácie.

Tým sa dostávame k problematike riadenia schém. Ako sa obchodné výzvy a požiadavky časom menia, mení sa aj štruktúra vašich údajov. Delta Lake uľahčuje zavádzanie nových meraní pri zmenách údajov. Používatelia majú prístup k jednoduchej sémantike na správu schém tabuliek. Tieto nástroje zahŕňajú Schema Enforcement, ktorý chráni používateľov pred neúmyselným znečistením ich tabuliek chybami alebo nepotrebnými údajmi, a Schema Evolution, ktorý umožňuje automatické pridávanie nových stĺpcov cenných údajov na príslušné miesta. V tomto článku sa ponoríme hlbšie do používania týchto nástrojov.

Pochopenie schém tabuliek

Každý DataFrame v Apache Spark obsahuje schému, ktorá definuje formu údajov, ako sú typy údajov, stĺpce a metadáta. V prípade Delta Lake je schéma tabuľky uložená vo formáte JSON v protokole transakcií.

Čo je presadzovanie schémy?

Schema Enforcement, tiež známy ako Schema Validation, je bezpečnostný mechanizmus v Delta Lake, ktorý zabezpečuje kvalitu údajov odmietnutím záznamov, ktoré sa nezhodujú so schémou tabuľky. Podobne ako hosteska na recepcii obľúbenej reštaurácie len s rezerváciou kontroluje, či sa každý stĺpec údajov zapísaných do tabuľky nachádza v zodpovedajúcom zozname očakávaných stĺpcov (inými slovami, či pre každý z nich existuje „rezervácia“ ) a odmietne všetky záznamy so stĺpcami, ktoré nie sú v zozname.

Ako funguje presadzovanie schémy?

Delta Lake používa kontrolu schémy pri zápise, čo znamená, že všetky nové zápisy do tabuľky sú kontrolované na kompatibilitu so schémou cieľovej tabuľky v čase zápisu. Ak je schéma nekonzistentná, Delta Lake úplne preruší transakciu (nezapíšu sa žiadne údaje) a vyvolá výnimku, aby upozornil používateľa na nezrovnalosť.
Delta Lake používa nasledujúce pravidlá na určenie, či je záznam kompatibilný s tabuľkou. Zapisovateľný dátový rámec:

  • nemôže obsahovať ďalšie stĺpce, ktoré nie sú v schéme cieľovej tabuľky. Naopak, všetko je v poriadku, ak prichádzajúce dáta neobsahujú absolútne všetky stĺpce z tabuľky – týmto stĺpcom budú jednoducho priradené nulové hodnoty.
  • nemôže mať typy údajov stĺpcov, ktoré sa líšia od typov údajov stĺpcov v cieľovej tabuľke. Ak stĺpec cieľovej tabuľky obsahuje údaje StringType, ale zodpovedajúci stĺpec v DataFrame obsahuje údaje typu IntegerType, presadenie schémy vyvolá výnimku a zabráni vykonaniu operácie zápisu.
  • nemôže obsahovať názvy stĺpcov, ktoré sa líšia iba veľkosťou písmen. To znamená, že v tej istej tabuľke nemôžete mať definované stĺpce s názvom „Foo“ a „Foo“. Zatiaľ čo Spark možno použiť v režime rozlišovania malých a veľkých písmen alebo v režime bez rozlišovania malých a veľkých písmen (predvolené), Delta Lake zachováva malé a veľké písmená, ale v úložisku schémy nerozlišuje. Pri ukladaní a vracaní informácií o stĺpcoch sa pri parketách rozlišujú veľké a malé písmená. Aby sme sa vyhli možným chybám, poškodeniu údajov alebo strate údajov (niečo, čo sme osobne zažili v Databricks), rozhodli sme sa pridať toto obmedzenie.

Aby sme to ilustrovali, pozrime sa, čo sa stane v kóde nižšie, keď sa pokúsime pridať niektoré novo vygenerované stĺpce do tabuľky Delta Lake, ktorá ešte nie je nakonfigurovaná tak, aby ich akceptovala.

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

Namiesto automatického pridávania nových stĺpcov zavedie Delta Lake schému a prestane písať. Aby Spark pomohol určiť, ktorý stĺpec (alebo množina stĺpcov) spôsobuje nezrovnalosť, zobrazí obe schémy zo sledovania zásobníka na porovnanie.

Aká je výhoda presadzovania schémy?

Pretože presadzovanie schémy je pomerne prísna kontrola, je to vynikajúci nástroj na použitie ako strážca čistej, plne transformovanej sady údajov, ktorá je pripravená na výrobu alebo spotrebu. Zvyčajne sa používa na tabuľky, ktoré priamo poskytujú údaje:

  • Algoritmy strojového učenia
  • BI dashboardy
  • Nástroje na analýzu a vizualizáciu údajov
  • Akýkoľvek produkčný systém, ktorý vyžaduje vysoko štruktúrované, silne typované sémantické schémy.

Na prípravu svojich údajov na túto poslednú prekážku mnohí používatelia používajú jednoduchú „multi-hop“ architektúru, ktorá postupne zavádza štruktúru do ich tabuliek. Ak sa chcete dozvedieť viac o tom, môžete si prečítať článok Strojové učenie na úrovni výroby s Delta Lake.

Samozrejme, presadzovanie schémy je možné použiť kdekoľvek vo vašom kanáli, ale pamätajte, že streamovanie do tabuľky môže byť v tomto prípade frustrujúce, pretože ste napríklad zabudli, že ste k prichádzajúcim údajom pridali ďalší stĺpec.

Zabránenie riedeniu údajov

Možno sa teraz pýtate, čo všetko je za tým rozruch? Koniec koncov, niekedy neočakávaná chyba „nesúlad schémy“ vás môže podraziť vo vašom pracovnom postupe, najmä ak ste v Delta Lake noví. Prečo nenechať zmeniť schému podľa potreby, aby som mohol zapísať svoj DataFrame bez ohľadu na to?

Ako hovorí staré príslovie, „unca prevencie stojí za libru liečby“. Ak sa v určitom bode nestaráte o presadzovanie svojej schémy, problémy s kompatibilitou údajových typov budú mať škaredú hlavu – zdanlivo homogénne zdroje nespracovaných údajov môžu obsahovať okrajové prípady, poškodené stĺpce, nesprávne tvarované mapovania alebo iné strašidelné veci, o ktorých sa dá snívať. nočné mory. Najlepším prístupom je zastaviť týchto nepriateľov pri bráne – pomocou presadzovania schém – a vysporiadať sa s nimi vo svetle, a nie neskôr, keď začnú číhať v temných hlbinách vášho výrobného kódu.

Presadzovanie schémy vám dáva istotu, že schéma vašej tabuľky sa nezmení, pokiaľ zmenu neschválite. Tým sa zabráni zriedeniu údajov, ku ktorému môže dôjsť, keď sa nové stĺpce pridávajú tak často, že predtým cenné, komprimované tabuľky strácajú svoj význam a užitočnosť v dôsledku zaplavenia údajov. Tým, že vás povzbudzuje, aby ste boli úmyselní, stanovili vysoké štandardy a očakávali vysokú kvalitu, presadzovanie schém robí presne to, na čo bolo navrhnuté – pomáha vám zostať svedomitým a vaše tabuľky čisté.

Ak sa po ďalšom zvažovaní rozhodnete, že naozaj potrebovať pridať nový stĺpec - žiadny problém, nižšie je jednoriadková oprava. Riešením je evolúcia okruhu!

Čo je evolúcia schémy?

Vývoj schémy je funkcia, ktorá umožňuje používateľom jednoducho meniť aktuálnu schému tabuľky podľa údajov, ktoré sa časom menia. Najčastejšie sa používa pri vykonávaní operácie pripojenia alebo prepísania na automatické prispôsobenie schémy tak, aby obsahovala jeden alebo viacero nových stĺpcov.

Ako funguje vývoj schémy?

Podľa príkladu z predchádzajúcej časti môžu vývojári jednoducho použiť vývoj schémy na pridanie nových stĺpcov, ktoré boli predtým odmietnuté z dôvodu nekonzistentnosti schémy. Vývoj obvodu sa aktivuje pridaním .option('mergeSchema', 'true') vášmu tímu Spark .write или .writeStream.

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

Ak chcete zobraziť graf, spustite nasledujúci dotaz Spark SQL

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

Ponorte sa do jazera Delta: Presadzovanie schém a vývoj
Prípadne môžete túto možnosť nastaviť pre celú reláciu Spark pridaním spark.databricks.delta.schema.autoMerge = True do konfigurácie Spark. Používajte to však opatrne, pretože presadzovanie schém vás už nebude upozorňovať na neúmyselné nezrovnalosti schém.

Zahrnutím parametra do požiadavky mergeSchema, všetky stĺpce, ktoré sa nachádzajú v DataFrame, ale nie v cieľovej tabuľke, sa automaticky pridajú na koniec schémy ako súčasť transakcie zápisu. Je možné pridať aj vnorené polia, ktoré sa tiež pridajú na koniec príslušných stĺpcov štruktúry.

Inžinieri dátumov a dátoví vedci môžu túto možnosť použiť na pridanie nových stĺpcov (možno nedávno sledovanej metriky alebo stĺpca predajnej výkonnosti z tohto mesiaca) do svojich existujúcich produkčných tabuliek strojového učenia bez toho, aby narušili existujúce modely založené na starých stĺpcoch.

Nasledujúce typy zmien schém sú povolené ako súčasť vývoja schémy počas pridávania alebo prepisovania tabuľky:

  • Pridanie nových stĺpcov (toto je najbežnejší scenár)
  • Zmena typov údajov z NullType -> akýkoľvek iný typ alebo podpora z ByteType -> ShortType -> IntegerType

Iné zmeny, ktoré nie sú povolené v rámci vývoja schémy, vyžadujú, aby bola schéma a údaje prepísané pridaním .option("overwriteSchema", "true"). Napríklad v prípade, že stĺpec „Foo“ bol pôvodne celé číslo a nová schéma bola typ údajov typu reťazec, potom by bolo potrebné prepísať všetky súbory Parquet(data). Takéto zmeny zahŕňajú:

  • vymazanie stĺpca
  • zmena typu údajov existujúceho stĺpca (na mieste)
  • premenovanie stĺpcov, ktoré sa líšia iba veľkosťou písmen (napríklad „Foo“ a „Foo“)

Nakoniec, s ďalším vydaním Spark 3.0 bude plne podporované explicitné DDL (pomocou ALTER TABLE), čo používateľom umožní vykonávať nasledujúce akcie na schémach tabuliek:

  • pridávanie stĺpcov
  • zmena komentárov stĺpcov
  • nastavenie vlastností tabuľky, ktoré riadia správanie tabuľky, ako je nastavenie dĺžky času uloženia protokolu transakcií.

Aká je výhoda evolúcie okruhu?

Vývoj schémy môžete použiť kedykoľvek zamýšľať zmeňte schému vašej tabuľky (na rozdiel od toho, keď ste do DataFrame omylom pridali stĺpce, ktoré by tam nemali byť). Toto je najjednoduchší spôsob migrácie schémy, pretože automaticky pridáva správne názvy stĺpcov a typy údajov bez toho, aby ste ich museli explicitne deklarovať.

Záver

Presadzovanie schémy odmietne všetky nové stĺpce alebo iné zmeny schémy, ktoré nie sú kompatibilné s vašou tabuľkou. Stanovením a udržiavaním týchto vysokých štandardov môžu analytici a inžinieri dôverovať tomu, že ich údaje majú najvyššiu úroveň integrity, komunikujú ich jasne a jasne, čo im umožňuje robiť lepšie obchodné rozhodnutia.

Na druhej strane, vývoj schémy dopĺňa presadzovanie zjednodušením údajný automatické zmeny schémy. Koniec koncov, nemalo by byť ťažké pridať stĺpec.

Nútenou aplikáciou schémy je jang, kde vývoj schémy je jin. Pri spoločnom použití tieto funkcie uľahčujú potlačenie šumu a ladenie signálu ako kedykoľvek predtým.

Tiež by sme sa chceli poďakovať Mukul Murthy a Pranav Anand za ich príspevky k tomuto článku.

Ďalšie články z tejto série:

Ponorte sa do jazera Delta: Rozbaľte denník transakcií

Súvisiace články

Strojové učenie na úrovni výroby s Delta Lake

Čo je to dátové jazero?

Zistite viac o kurze

Zdroj: hab.com

Pridať komentár