Zaronite u Delta Lake: provedba sheme i evolucija

Hej Habr! Vašoj pozornosti predstavljam prijevod članka "Ronjenje u jezero Delta: provedba sheme i evolucija" autora Buraka Yavuza, Brennera Heintza i Dennyja Leeja, koji je pripremljen uoči početka tečaja Inženjer podataka od OTUS-a.

Zaronite u Delta Lake: provedba sheme i evolucija

Podaci se, kao i naše iskustvo, neprestano gomilaju i razvijaju. Kako bismo održali korak, naši se mentalni modeli svijeta moraju prilagoditi novim podacima, od kojih neki sadrže nove dimenzije - nove načine promatranja stvari o kojima prije nismo imali pojma. Ti se mentalni modeli ne razlikuju mnogo od tabličnih shema koje definiraju kako klasificiramo i obrađujemo nove informacije.

Ovo nas dovodi do pitanja upravljanja shemama. Kako se poslovni ciljevi i zahtjevi mijenjaju tijekom vremena, tako se mijenja i struktura vaših podataka. Delta Lake olakšava implementaciju novih mjerenja kako se podaci mijenjaju. Korisnici imaju pristup jednostavnoj semantici za upravljanje svojim shemama tablica. Ovi alati uključuju Schema Enforcement, koji štiti korisnike od nenamjernog zagađivanja njihovih tablica pogreškama ili nepotrebnim podacima, i Schema Evolution, koji omogućuje automatsko dodavanje novih stupaca vrijednih podataka na odgovarajuća mjesta. U ovom članku ćemo se pozabaviti korištenjem ovih alata.

Razumijevanje shema tablica

Svaki DataFrame u Apache Sparku sadrži shemu koja definira oblik podataka kao što su tipovi podataka, stupci i metapodaci. Uz Delta Lake, shema tablice pohranjuje se u JSON formatu unutar dnevnika transakcija.

Što je provedba sheme?

Schema Enforcement, također poznat kao Schema Validation, zaštitni je mehanizam u Delta Lakeu koji jamči kvalitetu podataka odbijanjem zapisa koji ne odgovaraju shemi tablice. Poput hostese na recepciji popularnog restorana koji prihvaća samo rezervacije, on provjerava nalazi li se svaki stupac podataka unesenih u tablicu na odgovarajućem popisu očekivanih stupaca (drugim riječima, postoji li "rezervacija" za svaki od njih) i odbija sve unose sa stupcima koji nisu na popisu.

Kako funkcionira provedba sheme?

Delta Lake koristi provjeru valjanosti sheme pri upisivanju, što znači da se za sva nova pisanja u tablicu provjerava kompatibilnost sa shemom ciljne tablice u vrijeme pisanja. Ako je shema nedosljedna, Delta Lake u potpunosti poništava transakciju (nikakvi podaci nisu upisani) i izbacuje iznimku kako bi obavijestila korisnika o nedosljednosti.
Delta Lake koristi sljedeća pravila za određivanje je li zapis kompatibilan s tablicom. Pisani DataFrame:

  • ne može sadržavati dodatne stupce koji nisu u shemi ciljne tablice. I obrnuto, sve je u redu ako dolazni podaci ne sadrže apsolutno sve stupce iz tablice - tim će stupcima jednostavno biti dodijeljene nulte vrijednosti.
  • ne može imati tipove podataka stupaca koji se razlikuju od tipova podataka stupaca u ciljnoj tablici. Ako stupac u ciljnoj tablici sadrži podatke StringType, ali odgovarajući stupac u DataFrameu sadrži podatke IntegerType, provedba sheme izbacit će iznimku i spriječiti operaciju pisanja.
  • ne može sadržavati nazive stupaca koji se razlikuju samo u velikim i velikim slovima. To znači da u istoj tablici ne možete imati definirane stupce pod nazivom 'Foo' i 'foo'. Dok se Spark može koristiti u načinu rada koji razlikuje velika ili mala slova (zadano), Delta Lake čuva velika i mala slova, ali je neosjetljiv unutar pohrane sheme. Parquet razlikuje velika i mala slova kada pohranjuje i vraća informacije o stupcima. Kako bismo izbjegli moguće pogreške, oštećenje podataka ili gubitak podataka (što smo osobno iskusili u Databricksu), odlučili smo dodati ovo ograničenje.

Da bismo to ilustrirali, pogledajmo što se događa u donjem kodu kada pokušavate dodati neke novogenerirane stupce u tablicu Delta Lake koja još nije konfigurirana 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 stupaca, Delta Lake provodi shemu i zaustavlja snimanje. Kako bi se lakše odredilo koji stupac (ili njihov skup) uzrokuje neusklađenost, Spark izdvaja obje sheme iz stoga praćenja radi usporedbe.

Koja je korist od provedbe sheme?

Budući da je provedba sheme prilično rigorozna provjera, izvrstan je alat za korištenje kao vratar čistog, potpuno transformiranog skupa podataka koji je spreman za proizvodnju ili upotrebu. Obično se primjenjuje na tablice koje izravno unose podatke:

  • Algoritmi strojnog učenja
  • BI nadzorne ploče
  • Alati za analizu podataka i vizualizaciju
  • Bilo koji proizvodni sustav koji zahtijeva visoko strukturirane, snažno tipizirane semantičke sheme.

Kako bi pripremili svoje podatke za ovu posljednju prepreku, mnogi korisnici koriste jednostavnu "multi-hop" arhitekturu koja postupno uvodi strukturu u njihove tablice. Da biste saznali više o tome, možete pročitati članak Strojno učenje proizvodne razine s Delta Lakeom.

Naravno, provedba sheme može se koristiti bilo gdje u vašem cjevovodu, ali imajte na umu da strujanje u tablicu može biti frustrirajuće u ovom slučaju, jer ste, na primjer, zaboravili da ste dodali još jedan stupac u ulazne podatke.

Prevencija razrjeđivanja podataka

Do ovog trenutka možda se pitate čemu ta pompa? Uostalom, ponekad vas neočekivana pogreška "neusklađenosti sheme" može saplesti u tijeku rada, osobito ako ste novi u Delta Lakeu. Zašto jednostavno ne dopustim da se shema promijeni prema potrebi kako bih mogao napisati svoj DataFrame bez obzira na sve?

Kao što stara poslovica kaže: "Unca prevencije vrijedi pola funte lijeka." U nekom trenutku, ako se ne pobrinete za provedbu svoje sheme, problemi s kompatibilnošću tipa podataka će dignuti svoje ružne glave - naizgled homogeni neobrađeni izvori podataka mogu sadržavati rubne slučajeve, slomljene stupce, pogrešno oblikovana mapiranja ili druge strašne stvari o kojima sanjate .u noćnim morama. Najbolji pristup je zaustaviti te neprijatelje na vratima - provedbom sheme - i obračunati se s njima na svjetlu, a ne kasnije kad počnu lutati mračnim dubinama vašeg proizvodnog koda.

Provedba sheme daje vam sigurnost da se shema vaše tablice neće promijeniti osim ako sami ne potvrdite promjenu. To sprječava razrjeđivanje podataka do kojeg može doći kada se novi stupci dodaju toliko često da prethodno vrijedne, komprimirane tablice gube svoju vrijednost i korisnost zbog preplavljivanja podataka. Potičući vas da budete namjerni, postavljate visoke standarde i očekujete visoku kvalitetu, provedba sheme radi upravo ono za što je i osmišljena—pomaže vam da ostanete savjesni i da vaše proračunske tablice budu čiste.

Ako nakon daljnjeg razmatranja odlučite da doista trebati dodajte novi stupac - nema problema, ispod je ispravak u jednom retku. Rješenje je evolucija sklopova!

Što je evolucija sheme?

Evolucija sheme je značajka koja korisnicima omogućuje jednostavnu promjenu trenutne sheme tablice kako bi odgovarala podacima koji se mijenjaju tijekom vremena. Najčešće se koristi kada se izvodi operacija dodavanja ili prepisivanja za automatsku prilagodbu sheme za uključivanje jednog ili više novih stupaca.

Kako funkcionira evolucija sheme?

Slijedeći primjer iz prethodnog odjeljka, programeri mogu jednostavno koristiti evoluciju sheme za dodavanje novih stupaca koji su prethodno odbijeni zbog nedosljednosti sheme. Evolucija sklopa 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)

Za prikaz grafikona 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

Zaronite u Delta Lake: provedba sheme i evolucija
Alternativno, ovu opciju možete postaviti za cijelu Spark sesiju dodavanjem spark.databricks.delta.schema.autoMerge = True konfiguraciji Spark. Ipak, ovo koristite 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 nisu prisutni u ciljnoj tablici automatski se dodaju na kraj sheme kao dio transakcije pisanja. Također se mogu dodati ugniježđena polja, koja će također biti dodana na kraj odgovarajućih stupaca strukture.

Datumski inženjeri i podatkovni znanstvenici mogu upotrijebiti ovu opciju za dodavanje novih stupaca (možda nedavno praćene metrike ili stupca s brojkama prodaje za ovaj mjesec) u svoje postojeće proizvodne tablice strojnog učenja bez razbijanja postojećih modela temeljenih na starim stupcima.

Sljedeće vrste promjena sheme dopuštene su kao dio evolucije sheme kada se tablica doda ili prebriše:

  • Dodavanje novih stupaca (ovo je najčešći scenarij)
  • Promjena tipova podataka iz NullType -> bilo koje druge vrste ili promicanje iz ByteType -> ShortType -> IntegerType

Druge promjene koje nisu dopuštene kao dio evolucije sheme zahtijevaju da se shema i podaci prebrišu dodavanjem .option("overwriteSchema", "true"). Na primjer, u slučaju kada je stupac "Foo" izvorno bio cijeli broj, a nova shema bi bila vrsta podataka niza, tada bi se sve datoteke Parquet(data) trebale prebrisati. Te promjene uključuju:

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

Konačno, sa sljedećim izdanjem Spark 3.0, eksplicitni DDL (koristeći ALTER TABLE) bit će u potpunosti podržan, dopuštajući korisnicima izvođenje sljedećih radnji na shemama tablica:

  • dodavanje stupaca
  • mijenjanje komentara stupaca
  • postavljanje svojstava tablice koja određuju kako se tablica ponaša, kao što je postavljanje koliko dugo se čuva dnevnik transakcija.

Koja je korist od evolucije sheme?

Shematska evolucija se može koristiti kad god želite namjeravati promijenite shemu svoje tablice (za razliku od slučajnog dodavanja stupaca u vaš DataFrame koji tamo ne bi trebali biti). Ovo je najlakši način za migriranje vaše sheme jer automatski dodaje ispravne nazive stupaca i vrste podataka bez potrebe da ih izričito deklarirate.

Zaključak

Provedba 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 se pouzdati u to da će njihovi podaci imati najvišu razinu integriteta, jasno i koncizno obrazlažući ih, što im omogućuje donošenje boljih poslovnih odluka.

S druge strane, evolucija sheme nadopunjuje provedbu pojednostavljivanjem trebala automatske promjene sheme. Uostalom, ne bi trebalo biti teško dodati stupac.

Provedba sheme je yang, dok su evolucije sheme yin. Kada se koriste zajedno, ove značajke čine smanjenje šuma i ugađanje signala lakšim nego ikad.

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

Ostali članci u ovoj seriji:

Zaronite u Delta Lake: raspakirajte dnevnik transakcija

Povezani članci

Strojno učenje proizvodne razine s Delta Lakeom

Što je podatkovno jezero?

Saznajte više o tečaju

Izvor: www.habr.com

Dodajte komentar