Potopite se v jezero Delta: uveljavljanje in razvoj sheme

Hej Habr! Predstavljam vam prevod članka "Potop v jezero Delta: uveljavljanje in razvoj sheme" avtorjev Buraka Yavuza, Brennerja Heintza in Dennyja Leeja, ki je bil pripravljen v pričakovanju začetka tečaja Podatkovni inženir od OTUS.

Potopite se v jezero Delta: uveljavljanje in razvoj sheme

Podatki se, tako kot naše izkušnje, nenehno kopičijo in razvijajo. Da bi sledili, se morajo naši miselni modeli sveta prilagoditi novim podatkom, od katerih nekateri vsebujejo nove razsežnosti – nove načine opazovanja stvari, o katerih prej nismo imeli pojma. Ti mentalni modeli se ne razlikujejo veliko od shem tabel, ki določajo, kako kategoriziramo in obdelujemo nove informacije.

To nas pripelje do vprašanja upravljanja sheme. Ker se poslovni izzivi in ​​zahteve sčasoma spreminjajo, se spreminja tudi struktura vaših podatkov. Delta Lake olajša uvedbo novih meritev ob spremembi podatkov. Uporabniki imajo dostop do preproste semantike za upravljanje svojih shem tabel. Ta orodja vključujejo Schema Enforcement, ki ščiti uporabnike pred nenamernim onesnaženjem njihovih tabel z napakami ali nepotrebnimi podatki, in Schema Evolution, ki omogoča samodejno dodajanje novih stolpcev dragocenih podatkov na ustrezne lokacije. V tem članku se bomo poglobili v uporabo teh orodij.

Razumevanje shem tabel

Vsak DataFrame v Apache Spark vsebuje shemo, ki definira obliko podatkov, kot so tipi podatkov, stolpci in metapodatki. Pri Delta Lake je shema tabele shranjena v formatu JSON znotraj dnevnika transakcij.

Kaj je uveljavljanje sheme?

Uveljavljanje sheme, znano tudi kot preverjanje sheme, je varnostni mehanizem v Delta Lakeu, ki zagotavlja kakovost podatkov z zavrnitvijo zapisov, ki se ne ujemajo s shemo tabele. Kot hostesa na recepciji priljubljene restavracije, ki je namenjena samo rezervacijam, preveri, ali je vsak stolpec podatkov, vnesenih v tabelo, na ustreznem seznamu pričakovanih stolpcev (z drugimi besedami, ali za vsakega od njih obstaja "rezervacija" ) in zavrne vse zapise s stolpci, ki niso na seznamu.

Kako deluje uveljavljanje sheme?

Delta Lake uporablja preverjanje sheme ob pisanju, kar pomeni, da se pri vseh novih zapisih v tabelo preveri združljivost s shemo ciljne tabele v času pisanja. Če je shema nedosledna, Delta Lake v celoti prekine transakcijo (podatki niso zapisani) in sproži izjemo, da obvesti uporabnika o nedoslednosti.
Delta Lake uporablja naslednja pravila za ugotavljanje, ali je zapis združljiv s tabelo. DataFrame, ki ga je treba napisati:

  • ne more vsebovati dodatnih stolpcev, ki niso v shemi ciljne tabele. Nasprotno pa je vse v redu, če vhodni podatki ne vsebujejo popolnoma vseh stolpcev iz tabele - tem stolpcem bodo preprosto dodeljene ničelne vrednosti.
  • ne more imeti podatkovnih tipov stolpcev, ki se razlikujejo od podatkovnih tipov stolpcev v ciljni tabeli. Če ciljni stolpec tabele vsebuje podatke StringType, vendar ustrezni stolpec v DataFrame vsebuje podatke IntegerType, bo uveljavljanje sheme sprožilo izjemo in preprečilo izvedbo operacije pisanja.
  • ne more vsebovati imen stolpcev, ki se razlikujejo le po velikih in malih črkah. To pomeni, da v isti tabeli ne morete imeti definiranih stolpcev z imenom 'Foo' in 'foo'. Medtem ko se Spark lahko uporablja v načinu, ki razlikuje med velikimi ali malimi črkami (privzeto), Delta Lake ohranja velike in male črke, vendar je v shrambi sheme neobčutljiva. Parquet pri shranjevanju in vračanju informacij o stolpcu razlikuje med velikimi in malimi črkami. Da bi se izognili morebitnim napakam, poškodbam podatkov ali izgubi podatkov (kar smo osebno izkusili pri Databricks), smo se odločili dodati to omejitev.

Za ponazoritev tega si poglejmo, kaj se zgodi v spodnji kodi, ko poskušamo dodati nekaj na novo ustvarjenih stolpcev v tabelo Delta Lake, ki še ni konfigurirana za njihovo sprejemanje.

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

Namesto samodejnega dodajanja novih stolpcev Delta Lake vsili shemo in preneha pisati. Za pomoč pri ugotavljanju, kateri stolpec (ali niz stolpcev) povzroča neskladje, Spark izsledi obe shemi iz sledi sklada za primerjavo.

Kakšna je korist uveljavljanja sheme?

Ker je uveljavljanje sheme dokaj strog pregled, je odlično orodje za uporabo kot vratar čistega, popolnoma preoblikovanega nabora podatkov, ki je pripravljen za proizvodnjo ali porabo. Običajno se uporablja za tabele, ki neposredno hranijo podatke:

  • Algoritmi strojnega učenja
  • BI nadzorne plošče
  • Orodja za analizo in vizualizacijo podatkov
  • Vsak produkcijski sistem, ki zahteva visoko strukturirane, močno tipizirane semantične sheme.

Da bi svoje podatke pripravili na to zadnjo oviro, mnogi uporabniki uporabljajo preprosto "multi-hop" arhitekturo, ki postopoma uvaja strukturo v njihove tabele. Če želite izvedeti več o tem, si lahko ogledate članek Strojno učenje proizvodnega razreda z Delta Lake.

Seveda lahko uveljavljanje sheme uporabite kjer koli v vašem cevovodu, vendar ne pozabite, da je pretakanje v tabelo v tem primeru lahko frustrirajoče, ker ste na primer pozabili, da ste vhodnim podatkom dodali še en stolpec.

Preprečevanje redčenja podatkov

Zdaj se morda sprašujete, kaj je narobe? Navsezadnje vas lahko včasih nepričakovana napaka »neusklajenosti sheme« spotakne v poteku dela, še posebej, če ste novi v Delta Lakeu. Zakaj ne bi pustili, da se shema po potrebi spremeni, tako da lahko napišem svoj DataFrame ne glede na vse?

Kot pravi stari pregovor, je "unča preprečevanja vredna funta zdravljenja." Če na neki točki ne boste poskrbeli za uveljavljanje svoje sheme, bodo težave z združljivostjo podatkovnega tipa dvignile grdo glavo – na videz homogeni surovi viri podatkov lahko vsebujejo robne primere, poškodovane stolpce, napačno oblikovane preslikave ali druge grozljive stvari, o katerih lahko sanjate. nočne more. Najboljši pristop je, da te sovražnike ustavite pri vratih - z uveljavljanjem sheme - in se z njimi spopadete na svetlobi, namesto kasneje, ko se začnejo skrivati ​​v temnih globinah vaše produkcijske kode.

Uveljavljanje sheme vam daje zagotovilo, da se shema vaše tabele ne bo spremenila, razen če ne odobrite spremembe. To preprečuje redčenje podatkov, do katerega lahko pride, ko se novi stolpci dodajajo tako pogosto, da prej dragocene, stisnjene tabele izgubijo svoj pomen in uporabnost zaradi poplave podatkov. S tem, ko vas spodbuja, da ste namerni, postavljate visoke standarde in pričakujete visoko kakovost, uveljavljanje sheme naredi točno to, za kar je bilo zasnovano – pomaga vam, da ostanete vestni in vaše preglednice čiste.

Če se po nadaljnjem premisleku odločite, da res potreba dodajte nov stolpec - ni problema, spodaj je popravek v eni vrstici. Rešitev je razvoj vezja!

Kaj je razvoj sheme?

Razvoj sheme je funkcija, ki uporabnikom omogoča enostavno spreminjanje trenutne sheme tabele glede na podatke, ki se sčasoma spreminjajo. Najpogosteje se uporablja pri izvajanju operacije dodajanja ali prepisovanja za samodejno prilagoditev sheme za vključitev enega ali več novih stolpcev.

Kako deluje razvoj sheme?

Po zgledu iz prejšnjega razdelka lahko razvijalci preprosto uporabijo razvoj sheme za dodajanje novih stolpcev, ki so bili prej zavrnjeni zaradi nedoslednosti sheme. Razvoj vezja se aktivira z dodajanjem .option('mergeSchema', 'true') vaši ekipi Spark .write или .writeStream.

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

Če si želite ogledati graf, zaženite naslednjo poizvedbo 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

Potopite se v jezero Delta: uveljavljanje in razvoj sheme
Lahko pa to možnost nastavite za celotno sejo Spark z dodajanjem spark.databricks.delta.schema.autoMerge = True na konfiguracijo Spark. Vendar to uporabljajte previdno, saj vas uveljavljanje sheme ne bo več opozorilo na nenamerne nedoslednosti sheme.

Z vključitvijo parametra v zahtevo mergeSchema, so vsi stolpci, ki so prisotni v DataFrame, vendar ne v ciljni tabeli, samodejno dodani na konec sheme kot del transakcije pisanja. Dodate lahko tudi ugnezdena polja, ki bodo prav tako dodana na konec ustreznih strukturnih stolpcev.

Datumski inženirji in podatkovni znanstveniki lahko uporabijo to možnost za dodajanje novih stolpcev (morda nedavno spremljane metrike ali stolpca prodajne uspešnosti tega meseca) v svoje obstoječe produkcijske tabele strojnega učenja, ne da bi porušili obstoječe modele, ki temeljijo na starih stolpcih.

Naslednje vrste sprememb sheme so dovoljene kot del razvoja sheme med dodajanjem ali prepisovanjem tabele:

  • Dodajanje novih stolpcev (to je najpogostejši scenarij)
  • Spreminjanje tipov podatkov iz NullType -> katera koli druga vrsta ali napredovanje iz ByteType -> ShortType -> IntegerType

Druge spremembe, ki niso dovoljene v razvoju sheme, zahtevajo, da se shema in podatki prepišejo z dodajanjem .option("overwriteSchema", "true"). Na primer, v primeru, ko je bil stolpec "Foo" prvotno celo število in je bila nova shema podatkovni tip niza, bi bilo treba vse datoteke Parquet(data) prepisati. Take spremembe vključujejo:

  • brisanje stolpca
  • spreminjanje vrste podatkov obstoječega stolpca (na mestu)
  • preimenovanje stolpcev, ki se razlikujejo samo po velikih in malih črkah (na primer "Foo" in "foo")

Končno bo z naslednjo izdajo Spark 3.0 eksplicitni DDL v celoti podprt (z uporabo ALTER TABLE), kar uporabnikom omogoča izvajanje naslednjih dejanj na shemah tabel:

  • dodajanje stolpcev
  • spreminjanje komentarjev stolpcev
  • nastavitev lastnosti tabele, ki nadzorujejo vedenje tabele, kot je nastavitev časa, v katerem je shranjen dnevnik transakcij.

Kakšna je korist evolucije vezja?

Razvoj sheme lahko uporabite kadarkoli nameravati spremenite shemo vaše tabele (v nasprotju s tem, ko ste pomotoma dodali stolpce v svoj DataFrame, ki tam ne bi smeli biti). To je najlažji način za selitev vaše sheme, saj samodejno doda pravilna imena stolpcev in vrste podatkov, ne da bi jih bilo treba izrecno prijaviti.

Zaključek

Uveljavljanje sheme zavrne vse nove stolpce ali druge spremembe sheme, ki niso združljive z vašo tabelo. Z nastavitvijo in vzdrževanjem teh visokih standardov lahko analitiki in inženirji zaupajo, da imajo njihovi podatki najvišjo stopnjo integritete, ki jih sporočajo jasno in jasno, kar jim omogoča sprejemanje boljših poslovnih odločitev.

Po drugi strani pa razvoj sheme dopolnjuje uveljavljanje s poenostavitvijo domnevno samodejne spremembe sheme. Navsezadnje ne bi smelo biti težko dodati stolpca.

Prisilna uporaba sheme je jang, kjer je evolucija sheme jin. Če jih uporabljate skupaj, te funkcije olajšajo dušenje šuma in uglaševanje signala kot kdaj koli prej.

Prav tako bi se radi zahvalili Mukulu Murthyju in Pranavu Anandu za njune prispevke k temu članku.

Drugi članki v tej seriji:

Potopite se v jezero Delta: razpakiranje dnevnika transakcij

Sorodni članki

Strojno učenje proizvodnega razreda z Delta Lake

Kaj je podatkovno jezero?

Izvedite več o tečaju

Vir: www.habr.com

Dodaj komentar