Dive u Delta Lake: Sprovođenje i evolucija šeme

Hej Habr! Predstavljam Vašoj pažnji prevod članka "Ronjenje u Delta Lake: Sprovođenje šeme i evolucija" autori Burak Yavuz, Brenner Heintz i Denny Lee, koji je pripremljen u iščekivanju početka kursa Data Engineer od OTUS-a.

Dive u Delta Lake: Sprovođenje i evolucija šeme

Podaci se, kao i naše iskustvo, neprestano gomilaju i razvijaju. Da bismo održali korak, naši mentalni modeli svijeta moraju se prilagoditi novim podacima, od kojih neki sadrže nove dimenzije – nove načine promatranja stvari o kojima prije nismo imali pojma. Ovi mentalni modeli se ne razlikuju mnogo od shema tablica koje određuju kako kategoriziramo i obrađujemo nove informacije.

Ovo nas dovodi do pitanja upravljanja šemama. Kako se poslovni izazovi i zahtjevi mijenjaju tokom vremena, mijenja se i struktura vaših podataka. Delta Lake olakšava uvođenje novih mjerenja kako se podaci mijenjaju. Korisnici imaju pristup jednostavnoj semantici za upravljanje svojim šemama tablica. Ovi alati uključuju Schema Enforcement, koji štiti korisnike od nenamjernog zagađenja njihovih tablica greškama ili nepotrebnim podacima, i Schema Evolution, koji omogućava da se nove kolone vrijednih podataka automatski dodaju na odgovarajuće lokacije. U ovom članku ćemo dublje zaroniti u korištenje ovih alata.

Razumevanje šema tabela

Svaki DataFrame u Apache Spark-u sadrži šemu koja definira oblik podataka, kao što su tipovi podataka, stupci i metapodaci. Sa Delta Lakeom, šema tabele je pohranjena u JSON formatu unutar dnevnika transakcija.

Šta je sprovođenje šeme?

Sprovođenje šeme, takođe poznato kao validacija šeme, je sigurnosni mehanizam u Delta Lakeu koji obezbeđuje kvalitet podataka odbijanjem zapisa koji se ne podudaraju sa šemom tabele. Poput hostese na recepciji popularnog restorana samo za rezervacije, ona provjerava da li se svaka kolona podataka unesenih u tabelu nalazi u odgovarajućoj listi očekivanih kolona (drugim riječima, postoji li "rezervacija" za svaku od njih ) i odbija sve zapise sa stupcima koji nisu na listi.

Kako funkcionira primjena šeme?

Delta Lake koristi provjeru šeme pri pisanju, što znači da se sva nova upisivanja u tablicu provjeravaju radi kompatibilnosti sa šemom ciljne tablice u vrijeme pisanja. Ako je šema nedosljedna, Delta Lake u potpunosti prekida transakciju (ne upisuju se podaci) i podiže izuzetak kako bi obavijestio korisnika o nedosljednosti.
Delta Lake koristi sljedeća pravila da odredi da li je zapis kompatibilan sa tablicom. Upisiv okvir podataka:

  • ne može sadržavati dodatne stupce koji nisu u šemi ciljne tablice. Suprotno tome, sve je u redu ako dolazni podaci ne sadrže apsolutno sve kolone iz tabele - ovim kolonama će jednostavno biti dodeljene nulte vrednosti.
  • ne mogu imati tipove podataka stupaca koji se razlikuju od tipova podataka stupaca u ciljnoj tablici. Ako kolona ciljne tablice sadrži podatke StringType, ali odgovarajući stupac u DataFrameu sadrži podatke tipa IntegerType, provedba sheme će baciti izuzetak i spriječiti da se izvrši operacija pisanja.
  • ne može sadržavati nazive stupaca koji se razlikuju samo velikim i malim slovima. To znači da ne možete imati kolone pod nazivom 'Foo' i 'foo' definirane u istoj tablici. Dok Spark može da se koristi u režimu osetljivom na mala ili mala slova (podrazumevano), Delta Lake čuva velika i mala slova, ali je neosetljiv u skladištu šeme. Parket je osjetljiv na velika i mala slova prilikom pohranjivanja i vraćanja informacija o stupcu. Kako bismo izbjegli moguće greške, oštećenje podataka ili gubitak podataka (nešto što smo lično iskusili u Databricksu), odlučili smo dodati ovo ograničenje.

Da bismo to ilustrovali, pogledajmo šta se dešava u kodu ispod kada pokušamo da dodamo neke novogenerisane kolone u Delta Lake tabelu koja još nije konfigurisana da ih prihvati.

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

Umjesto automatskog dodavanja novih kolona, ​​Delta Lake nameće šemu i zaustavlja pisanje. Kako bi se utvrdilo koji stupac (ili skup stupaca) uzrokuje neslaganje, Spark ispisuje obje šeme iz praćenja steka radi poređenja.

Koja je korist od primjene šeme?

Budući da je primjena sheme prilično stroga provjera, to je odličan alat za korištenje kao čuvar čistog, potpuno transformiranog skupa podataka koji je spreman za proizvodnju ili potrošnju. Obično se primjenjuje na tabele koje direktno unose podatke:

  • Algoritmi mašinskog učenja
  • BI kontrolne table
  • Alati za analizu i vizualizaciju podataka
  • Svaki proizvodni sistem koji zahtijeva visoko strukturirane, snažno tipizirane semantičke sheme.

Da bi svoje podatke pripremili za ovu poslednju prepreku, mnogi korisnici koriste jednostavnu arhitekturu „više skokova“ koja postepeno uvodi strukturu u njihove tabele. Da biste saznali više o tome, možete pogledati članak Mašinsko učenje na nivou proizvodnje uz Delta Lake.

Naravno, primjena sheme se može koristiti bilo gdje u vašem cjevovodu, ali zapamtite da strujanje u tablicu u ovom slučaju može biti frustrirajuće jer ste, na primjer, zaboravili da ste dodali još jednu kolonu dolaznim podacima.

Sprečavanje razvodnjavanja podataka

Do sada se možda pitate oko čega je tolika gužva? Na kraju krajeva, ponekad neočekivana greška "nepodudaranja sheme" može da vas zavede u toku vašeg posla, posebno ako ste novi u Delta Lakeu. Zašto jednostavno ne dozvolite da se šema promijeni po potrebi tako da mogu napisati svoj DataFrame bez obzira na sve?

Kako stara izreka kaže, "unca prevencije vrijedi funtu liječenja." U nekom trenutku, ako ne vodite računa o provođenju svoje sheme, problemi s kompatibilnošću tipova podataka će se pojaviti u svojim ružnim glavama - naizgled homogeni izvori sirovih podataka mogu sadržavati rubne slučajeve, oštećene stupce, deformisana mapiranja ili druge strašne stvari o kojima možete sanjati noćne more. Najbolji pristup je zaustaviti ove neprijatelje na kapiji - provođenjem sheme - i nositi se s njima na svjetlu, a ne kasnije kada počnu vrebati u mračnim dubinama vašeg proizvodnog koda.

Provođenje šeme daje vam sigurnost da se shema vaše tablice neće promijeniti osim ako ne odobrite promjenu. Ovo sprečava razvodnjavanje podataka, do kojeg može doći kada se nove kolone dodaju tako često da ranije vrijedne, komprimirane tablice gube svoje značenje i korisnost zbog poplave podataka. Podstičući vas da budete namjerni, postavite visoke standarde i očekujete visoku kvalitetu, provedba sheme čini upravo ono za što je dizajnirana – pomaže vam da ostanete savjesni i da vaše proračunske tablice budu čiste.

Ako nakon daljeg razmatranja odlučite da zaista potreba dodajte novu kolonu - nema problema, ispod je ispravka u jednom redu. Rješenje je evolucija kola!

Šta je evolucija šeme?

Evolucija šeme je funkcija koja omogućava korisnicima da lako promene trenutnu šemu tabele u skladu sa podacima koji se menjaju tokom vremena. Najčešće se koristi prilikom izvođenja operacije dodavanja ili ponovnog pisanja kako bi se shema automatski prilagodila uključivanju jednog ili više novih stupaca.

Kako funkcionira evolucija sheme?

Slijedeći primjer iz prethodnog odjeljka, programeri mogu lako koristiti evoluciju sheme za dodavanje novih stupaca koji su prethodno odbijeni zbog nedosljednosti sheme. Evolucija kola se aktivira dodavanjem .option('mergeSchema', 'true') vašem Spark timu .write или .writeStream.

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

Da vidite grafikon, pokrenite sljedeći Spark SQL upit

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

Dive u Delta Lake: Sprovođenje i evolucija šeme
Alternativno, ovu opciju možete postaviti za cijelu Spark sesiju dodavanjem spark.databricks.delta.schema.autoMerge = True na konfiguraciju Spark. Ali koristite ovo s oprezom, jer vas provedba sheme više neće upozoravati na nenamjerne nedosljednosti sheme.

Uključivanjem parametra u zahtjev mergeSchema, svi stupci koji su prisutni u DataFrameu, ali ne u ciljnoj tablici, automatski se dodaju na kraj sheme kao dio transakcije pisanja. Ugniježđena polja se također mogu dodati i ona će također biti dodana na kraj odgovarajućih stupaca strukture.

Inženjeri datuma i naučnici podataka mogu koristiti ovu opciju da dodaju nove kolone (možda nedavno praćenu metriku ili kolonu performansi prodaje ovog mjeseca) u svoje postojeće proizvodne tablice mašinskog učenja bez razbijanja postojećih modela zasnovanih na starim kolonama.

Sljedeće vrste promjena sheme su dozvoljene kao dio evolucije sheme tokom dodavanja ili ponovnog pisanja tablice:

  • Dodavanje novih kolona (ovo je najčešći scenario)
  • Promjena tipova podataka iz NullType -> bilo kojeg drugog tipa ili promoviranje iz ByteType -> ShortType -> IntegerType

Ostale promjene koje nisu dozvoljene u evoluciji sheme zahtijevaju da se shema i podaci ponovo napišu dodavanjem .option("overwriteSchema", "true"). Na primjer, u slučaju kada je stupac "Foo" izvorno bio cijeli broj, a nova shema je bila string tip podataka, tada bi sve datoteke Parketa(podataka) trebale biti prepisane. Takve promjene uključuju:

  • brisanje kolone
  • promjena tipa podataka postojeće kolone (na mjestu)
  • preimenovanje stupaca koji se razlikuju samo u velikim i velikim slovima (na primjer, "Foo" i "foo")

Konačno, sa sljedećim izdanjem Spark 3.0, eksplicitni DDL će biti u potpunosti podržan (koristeći ALTER TABLE), omogućavajući korisnicima da izvrše sljedeće radnje na šemama tablica:

  • dodavanje kolona
  • mijenjanje komentara kolone
  • postavljanje svojstava tablice koja kontroliraju ponašanje tablice, kao što je postavljanje dužine vremena pohranjivanja dnevnika transakcija.

Koja je korist od evolucije kola?

Evolucija šeme se može koristiti kad god namjeravaju promijenite šemu svoje tablice (za razliku od slučaja kada ste slučajno dodali stupce u svoj DataFrame koji ne bi trebali biti tamo). Ovo je najlakši način za migraciju vaše sheme jer automatski dodaje ispravna imena kolona i tipove podataka bez potrebe da ih eksplicitno deklarirate.

zaključak

Sprovođenje sheme odbija sve nove stupce ili druge promjene sheme koje nisu kompatibilne s vašom tablicom. Postavljanjem i održavanjem ovih visokih standarda, analitičari i inženjeri mogu vjerovati da njihovi podaci imaju najviši nivo integriteta, saopštavajući ih jasno i jasno, omogućavajući im da donose bolje poslovne odluke.

S druge strane, evolucija sheme dopunjuje primjenu pojednostavljivanjem navodno automatske promjene šeme. Na kraju krajeva, ne bi trebalo biti teško dodati kolonu.

Prisilna primjena šeme je jang, gdje je evolucija šeme jin. Kada se koriste zajedno, ove karakteristike čine potiskivanje šuma i podešavanje signala lakšim nego ikad.

Također bismo željeli zahvaliti Mukul Murthyju i Pranavu Anandu na njihovom doprinosu ovom članku.

Ostali članci u ovoj seriji:

Zaronite u Delta Lake: Raspakivanje dnevnika transakcija

povezani članci

Mašinsko učenje na proizvodnom nivou uz Delta Lake

Šta je jezero podataka?

Saznajte više o kursu

izvor: www.habr.com

Dodajte komentar