Äau Habr! PiedÄvÄju jÅ«su uzmanÄ«bai raksta tulkojumu Buraka Javuza, Brennera Heinca un Denija LÄ« izstrÄdÄtais materiÄls, kas tika sagatavots, gaidot kursa atklÄÅ”anu. no OTUS.

Dati, tÄpat kÄ mÅ«su pieredze, pastÄvÄ«gi uzkrÄjas un attÄ«stÄs. Lai neatpaliktu, mÅ«su pasaules mentÄlajiem modeļiem ir jÄpielÄgojas jauniem datiem, no kuriem daži satur jaunas dimensijas ā jaunus veidus, kÄ novÄrot lietas, par kurÄm iepriekÅ” mums nebija ne jausmas. Å ie mentÄlie modeļi neatŔķiras no shÄmÄm izklÄjlapÄs, kas nosaka, kÄ mÄs klasificÄjam un apstrÄdÄjam jaunu informÄciju.
Tas mÅ«s noved pie shÄmu pÄrvaldÄ«bas jautÄjuma. Laika gaitÄ, attÄ«stoties biznesa mÄrÄ·iem un prasÄ«bÄm, mainÄs arÄ« jÅ«su datu struktÅ«ra. Delta Lake atvieglo jaunu dimensiju ievieÅ”anu, mainoties datiem. LietotÄjiem ir pieejama vienkÄrÅ”a semantika tabulu shÄmu pÄrvaldÄ«bai. Å ie rÄ«ki ietver shÄmu ievieÅ”anas rÄ«ku, kas aizsargÄ lietotÄjus no netīŔas tabulu pÄrblÄ«vÄÅ”anas ar kļūdÄm vai nevajadzÄ«giem datiem, un shÄmu evolÅ«cijas rÄ«ku, kas automÄtiski pievieno jaunas kolonnas, kas satur vÄrtÄ«gus datus atbilstoÅ”ajÄs vietÄs. Å ajÄ rakstÄ mÄs sÄ«kÄk aplÅ«kosim Å”o rÄ«ku lietoÅ”anu.
Tabulu shÄmu izpratne
Katrs DataFrame Apache Spark satur shÄmu, kas nosaka datu formu, piemÄram, datu tipus, kolonnas un metadatus. Izmantojot Delta Lake, tabulas shÄma tiek glabÄta JSON formÄtÄ transakciju žurnÄlÄ.
Kas ir shÄmas izpilde?
ShÄmas ievieÅ”ana, kas pazÄ«stama arÄ« kÄ shÄmas validÄcija, ir droŔības mehÄnisms Delta Lake sistÄmÄ, kas nodroÅ”ina datu kvalitÄti, noraidot ierakstus, kas neatbilst tabulas shÄmai. LÄ«dzÄ«gi kÄ viesmÄ«le populÄrÄ restorÄnÄ, kas pieÅem tikai rezervÄcijas, shÄmas ievieÅ”ana pÄrbauda, āāvai katra tabulÄ ievadÄ«tÄ datu kolonna ir atbilstoÅ”ajÄ paredzamo kolonnu sarakstÄ (citiem vÄrdiem sakot, vai katrai no tÄm ir "rezervÄcija"), un noraida visus ierakstus ar kolonnÄm, kas nav sarakstÄ.
KÄ darbojas shÄmas ievieÅ”ana?
Delta Lake izmanto shÄmas pÄrbaudi rakstīŔanas laikÄ, kas nozÄ«mÄ, ka visi jaunie ieraksti tabulÄ rakstīŔanas laikÄ tiek pÄrbaudÄ«ti, lai pÄrliecinÄtos par saderÄ«bu ar mÄrÄ·a tabulas shÄmu. Ja shÄma nav saderÄ«ga, Delta Lake pilnÄ«bÄ pÄrtrauc darÄ«jumu (dati netiek ierakstÄ«ti) un izdod izÅÄmumu, lai informÄtu lietotÄju par neatbilstÄ«bu.
Delta Lake izmanto Å”Ädus noteikumus, lai noteiktu, vai ieraksts ir saderÄ«gs ar tabulu. Tiek rakstÄ«ts DataFrame:
- TajÄ nevar bÅ«t papildu kolonnas, kas nav iekļautas mÄrÄ·a tabulas shÄmÄ. Un otrÄdi, ir labi, ja ienÄkoÅ”ajos datos nav iekļautas visas tabulas kolonnas ā Ŕīm kolonnÄm vienkÄrÅ”i tiks pieŔķirtas nulles vÄrtÄ«bas.
- kolonnu datu tipi nevar atŔķirties no mÄrÄ·a tabulas kolonnu datu tipiem. Ja mÄrÄ·a tabulas kolonnÄ ir StringType dati, bet atbilstoÅ”ajÄ DataFrame kolonnÄ ir IntegerType dati, shÄmas ievieÅ”ana radÄ«s izÅÄmumu un neļaus veikt rakstīŔanas darbÄ«bu.
- nevar saturÄt kolonnu nosaukumus, kas atŔķiras tikai pÄc reÄ£istrÄ. Tas nozÄ«mÄ, ka vienÄ tabulÄ nevar bÅ«t definÄtas kolonnas ar nosaukumiem āFooā un āfooā. Lai gan Spark var izmantot reÄ£istrjutÄ«gÄ vai nereÄ£istrjutÄ«gÄ režīmÄ (pÄc noklusÄjuma), Delta Lake saglabÄ reÄ£istrjutÄ«gu, bet ir nereÄ£istrjutÄ«gs, saglabÄjot shÄmu. Parquet ir reÄ£istrjutÄ«gs, saglabÄjot un izgÅ«stot kolonnu informÄciju. Lai izvairÄ«tos no iespÄjamÄm kļūdÄm, datu bojÄjumiem vai datu zuduma (ko mÄs personÄ«gi esam piedzÄ«vojuÅ”i Databricks), mÄs nolÄmÄm pievienot Å”o ierobežojumu.
Lai to ilustrÄtu, aplÅ«kosim, kas notiek tÄlÄk redzamajÄ kodÄ, kad mÄÄ£inÄm pievienot dažas jaunizveidotas kolonnas Delta Lake tabulai, kas vÄl nav konfigurÄta to pieÅemÅ”anai.
# Š”Š³ŠµŠ½ŠµŃŠøŃŃŠµŠ¼ 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.TÄ vietÄ, lai automÄtiski pievienotu jaunas kolonnas, Delta Lake ievieÅ” shÄmu un pÄrtrauc rakstīŔanu. Lai palÄ«dzÄtu noteikt, kura kolonna (vai kolonnu kopas) rada neatbilstÄ«bu, Spark salÄ«dzinÄÅ”anai parÄda abas shÄmas no steka izsekoÅ”anas.
KÄds ir shÄmas ievieÅ”anas ieguvums?
TÄ kÄ shÄmas ievieÅ”ana ir diezgan stingra pÄrbaude, tas ir lielisks rÄ«ks, ko izmantot kÄ vÄrtu sargu tÄ«rai, pilnÄ«bÄ pÄrveidotai datu kopai, kas ir gatava ražoÅ”anai vai patÄriÅam. To parasti piemÄro tabulÄm, kas tieÅ”i apkopo datus:
- MaŔīnmÄcīŔanÄs algoritmi
- BI informÄcijas paneļi
- Datu analÄ«zes un vizualizÄcijas rÄ«ki
- Jebkura ražoÅ”anas sistÄma, kurai nepiecieÅ”amas stingri strukturÄtas, stingri tipizÄtas semantiskÄs shÄmas.
Lai sagatavotu savus datus Å”im pÄdÄjam ŔķÄrslim, daudzi lietotÄji izmanto vienkÄrÅ”u "vairÄku apiÅu" arhitektÅ«ru, kas pakÄpeniski ievieÅ” struktÅ«ru tabulÄs. Lai iegÅ«tu plaÅ”Äku informÄciju, varat izlasÄ«t rakstu.
Protams, shÄmas ievieÅ”anu var izmantot jebkur jÅ«su cauruļvadÄ, taÄu atcerieties, ka rakstīŔana tabulÄ Å”ajÄ gadÄ«jumÄ var bÅ«t nomÄcoÅ”a, piemÄram, tÄpÄc, ka esat aizmirsis, ka ienÄkoÅ”ajiem datiem pievienojÄt vÄl vienu kolonnu.
Datu saŔķidrinÄÅ”anas novÄrÅ”ana
Å ajÄ brÄ«dÄ« jÅ«s, iespÄjams, domÄjat, par ko ir visa Ŕī jezga? Galu galÄ dažreiz negaidÄ«ta "shÄmas neatbilstÄ«bas" kļūda var jÅ«s apturÄt darbplÅ«smÄ, it Ä«paÅ”i, ja esat jauns Delta Lake lietotÄjs. KÄpÄc gan neļaut shÄmai mainÄ«ties pÄc nepiecieÅ”amÄ«bas, lai es varÄtu rakstÄ«t savu DataFrame neatkarÄ«gi no apstÄkļiem?
KÄ vÄsta sens teiciens: "unce profilakses ir mÄrciÅas ÄrstÄÅ”anas vÄrta." KÄdÄ brÄ«dÄ«, ja nerÅ«pÄsities par shÄmas ievieÅ”anu, parÄdÄ«sies datu tipu saderÄ«bas problÄmas ā Ŕķietami homogÄni neapstrÄdÄti datu avoti var saturÄt robežgadÄ«jumus, bojÄtas kolonnas, nepareizi veidotus kartÄjumus vai citus murgus. VislabÄkÄ pieeja ir apturÄt Å”os ienaidniekus pie vÄrtiem ā ar shÄmas ievieÅ”anu ā un cÄ«nÄ«ties ar tiem atklÄti, nevis vÄlÄk, kad tie sÄk slÄpties jÅ«su ražoÅ”anas koda tumÅ”ajÄs dzÄ«lÄs.
ShÄmas ievieÅ”ana nodroÅ”ina, ka jÅ«su tabulas shÄma nemainÄ«sies, ja vien jÅ«s nepÄrprotami neapstiprinÄsiet izmaiÅas. Tas novÄrÅ” datu atŔķaidīŔanu, kas var notikt, ja jaunas kolonnas tiek pievienotas tik bieži, ka iepriekÅ” vÄrtÄ«gas, kompaktas tabulas datu pÄrpilnÄ«bas dÄļ zaudÄ savu nozÄ«mi un lietderÄ«bu. Mudinot jÅ«s bÅ«t apzinÄtiem, noteikt augstus standartus un sagaidÄ«t augstu kvalitÄti, shÄmas ievieÅ”ana dara tieÅ”i to, ko tÄ bija paredzÄta ā palÄ«dz saglabÄt integritÄti un uzturÄt tabulas sakÄrtotas.
Ja pÄc turpmÄkas apsvÄrÅ”anas jÅ«s nolemjat, ka tieÅ”Äm tÄ ir. nepiecieÅ”amÄ«ba Jaunas kolonnas pievienoÅ”ana nav problÄma; vienas rindiÅas labojums ir sniegts zemÄk. RisinÄjums ir shÄmas evolÅ«cija!
Kas ir shÄmas evolÅ«cija?
ShÄmas evolÅ«cija ir funkcija, kas ļauj lietotÄjiem viegli modificÄt tabulas paÅ”reizÄjo shÄmu, lai pielÄgotos mainÄ«gajiem datiem laika gaitÄ. To visbiežÄk izmanto ievietoÅ”anas vai pÄrrakstīŔanas darbÄ«bu laikÄ, lai automÄtiski pielÄgotu shÄmu, iekļaujot vienu vai vairÄkas jaunas kolonnas.
KÄ darbojas shÄmas evolÅ«cija?
Sekojot iepriekÅ”ÄjÄs sadaļas piemÄram, izstrÄdÄtÄji var viegli izmantot shÄmas evolÅ«ciju, lai pievienotu jaunas kolonnas, kas iepriekÅ” tika noraidÄ«tas shÄmas neatbilstÄ«bas dÄļ. ShÄmas evolÅ«cija tiek aktivizÄta, pievienojot .option('mergeSchema', 'true') jÅ«su Spark komandai .write или .writeStream.
# ŠŠ¾Š±Š°Š²ŃŃŠµ ŠæŠ°ŃŠ°Š¼ŠµŃŃ mergeSchema
loans.write.format("delta")
.option("mergeSchema", "true")
.mode("append")
.save(DELTALAKE_SILVER_PATH)Lai skatÄ«tu grafiku, palaidiet Å”o Spark SQL vaicÄjumu
# Š”Š¾Š·Š“Š°Š¹ŃŠµ Š³ŃŠ°ŃŠøŠŗ Ń Š½Š¾Š²ŃŠ¼ ŃŃŠ¾Š»Š±Ńом, ŃŃŠ¾Š±Ń ŠæŠ¾Š“ŃŠ²ŠµŃГиŃŃ, ŃŃŠ¾ запиŃŃ ŠæŃŠ¾Ńла ŃŃŠæŠµŃŠ½Š¾
%sql
SELECT addr_state, sum(`amount`) AS amount
FROM loan_by_state_delta
GROUP BY addr_state
ORDER BY sum(`amount`)
DESC LIMIT 10 
Varat arÄ« iestatÄ«t Å”o opciju visai Spark sesijai, pievienojot spark.databricks.delta.schema.autoMerge = True Spark konfigurÄcijÄ. TomÄr izmantojiet to piesardzÄ«gi, jo shÄmas ievieÅ”ana vairs nebrÄ«dinÄs par netīŔÄm shÄmas neatbilstÄ«bÄm.
Iekļaujot pieprasÄ«jumÄ parametru mergeSchemaVisas DataFrame esoÅ”Äs, bet mÄrÄ·a tabulÄ trÅ«kstoÅ”Äs kolonnas rakstīŔanas transakcijas laikÄ tiek automÄtiski pievienotas shÄmai. Var pievienot arÄ« ligzdotus laukus, un tie tiks pievienoti arÄ« atbilstoÅ”ajÄm kolonnÄm struktÅ«rÄ.
Datu inženieri un zinÄtnieki var izmantot Å”o opciju, lai esoÅ”ajÄm maŔīnmÄcīŔanÄs ražoÅ”anas tabulÄm pievienotu jaunas kolonnas (piemÄram, nesen izsekotu metriku vai Ŕī mÄneÅ”a pÄrdoÅ”anas rÄdÄ«tÄju kolonnu), nepÄrtraucot esoÅ”os modeļus, kuru pamatÄ ir vecÄs kolonnas.
Tabulas ievietoÅ”anas vai pÄrrakstīŔanas laikÄ shÄmas evolÅ«cijas ietvaros ir atļautas Å”Äda veida shÄmas izmaiÅas:
- Jaunu kolonnu pievienoÅ”ana (Å”is ir visizplatÄ«tÄkais scenÄrijs)
- Datu tipu maiÅa no NullType -> jebkurÅ” cits tips vai pÄreja no ByteType -> ShortType -> IntegerType
Citas izmaiÅas, kas shÄmas evolÅ«cijas ietvaros nav atļautas, prasa shÄmas un datu pÄrrakstīŔanu, pievienojot .option("overwriteSchema", "true")PiemÄram, ja kolonna "Foo" sÄkotnÄji bija vesels skaitlis un jaunÄ shÄma bija virknes datu tips, tad visi Parquet (datu) faili bÅ«tu jÄpÄrraksta. Å Ädas izmaiÅas ietver:
- kolonnas dzÄÅ”ana
- mainot esoÅ”as kolonnas datu tipu (vietÄ)
- pÄrdÄvÄt kolonnas, kas atŔķiras tikai ar reÄ£istru (piemÄram, "Foo" un "foo")
Visbeidzot, ar nÄkamo laidienu, Spark 3.0, tiks pilnÄ«bÄ atbalstÄ«ta tieÅ”a DDL (izmantojot ALTER TABLE), kas ļaus lietotÄjiem veikt Å”Ädas darbÄ«bas ar tabulu shÄmÄm:
- kolonnu pievienoŔana
- mainÄ«gie kolonnu komentÄri
- Tabulas rekvizÄ«tu iestatīŔana, kas nosaka tabulas darbÄ«bu, piemÄram, darÄ«jumu žurnÄla saglabÄÅ”anas perioda iestatīŔana.
KÄda ir shÄmas evolÅ«cijas priekÅ”rocÄ«ba?
ShÄmas evolÅ«ciju var izmantot jebkurÄ laikÄ. plÄnoju Mainiet tabulas shÄmu (nevis nejauÅ”i pievienojiet DataFrame kolonnas, kurÄm tur nevajadzÄtu bÅ«t). Å is ir vienkÄrÅ”Äkais veids, kÄ migrÄt shÄmu, jo tÄ automÄtiski pievieno pareizos kolonnu nosaukumus un datu tipus, tos skaidri nedeklarÄjot.
SecinÄjums
ShÄmas ievieÅ”ana noraida visas jaunÄs kolonnas vai citas shÄmas izmaiÅas, kas nav saderÄ«gas ar jÅ«su tabulu. Nosakot un ievÄrojot Å”os augstos standartus, analÄ«tiÄ·i un inženieri var bÅ«t pÄrliecinÄti, ka viÅu datiem ir visaugstÄkais integritÄtes lÄ«menis, tie tiek skaidri un kodolÄ«gi argumentÄti, ļaujot viÅiem pieÅemt efektÄ«vÄkus biznesa lÄmumus.
No otras puses, shÄmas attÄ«stÄ«ba papildina izpildes nodroÅ”inÄÅ”anu, vienkÄrÅ”ojot apgalvots AutomÄtiskas shÄmas izmaiÅas. Galu galÄ kolonnas pievienoÅ”anai nevajadzÄtu bÅ«t tik sarežģītai.
ĶÄdes pastiprinÄÅ”ana ir Ä·Ädes evolÅ«cijas iÅ jaÅ. KopÄ Å”Ä«s funkcijas padara trokÅ”Åu slÄpÄÅ”anu un signÄla regulÄÅ”anu vienkÄrÅ”Äku nekÄ jebkad agrÄk.
MÄs vÄlÄtos pateikties arÄ« Mukulam Murtijam un Pranavam Anandam par viÅu ieguldÄ«jumu Å”ajÄ rakstÄ.
Citi raksti Å”ajÄ sÄrijÄ:

Saistītie raksti
Avots: www.habr.com
