Ienirstiet Deltas ezerā: shēmas ievieÅ”ana un attÄ«stÄ«ba

Čau Habr! Piedāvāju jÅ«su uzmanÄ«bai raksta tulkojumu "NirÅ”ana Deltas ezerā: shēmas ievieÅ”ana un attÄ«stÄ«ba" autori Buraks Yavuz, Brenner Heintz un Denijs LÄ«, kas tika sagatavots, gaidot kursa sākumu Datu inženieris no OTUS.

Ienirstiet Deltas ezerā: shēmas ievieÅ”ana un attÄ«stÄ«ba

Dati, tāpat kā mÅ«su pieredze, nepārtraukti uzkrājas un attÄ«stās. Lai neatpaliktu, mÅ«su garÄ«gajiem pasaules modeļiem ir jāpielāgojas jauniem datiem, no kuriem daži satur jaunas dimensijas ā€” jaunus veidus, kā novērot lietas, par kurām mums iepriekÅ” nebija ne jausmas. Å ie garÄ«gie modeļi daudz neatŔķiras no tabulu shēmām, kas nosaka, kā mēs klasificējam un apstrādājam jaunu informāciju.

Tas mÅ«s noved pie shēmas pārvaldÄ«bas jautājuma. Laika gaitā mainās biznesa izaicinājumi un prasÄ«bas, mainās arÄ« jÅ«su datu struktÅ«ra. Delta Lake ļauj viegli ieviest jaunus mērÄ«jumus, mainoties datiem. Lietotājiem ir pieejama vienkārÅ”a semantika, lai pārvaldÄ«tu savas tabulu shēmas. Å ie rÄ«ki ietver Schema Enforcement, kas pasargā lietotājus no nejauÅ”as tabulu piesārņoÅ”anas ar kļūdām vai nevajadzÄ«giem datiem, un Schema Evolution, kas ļauj atbilstoÅ”ajām vietām automātiski pievienot jaunas vērtÄ«gu datu kolonnas. Å ajā rakstā mēs iedziļināsimies Å”o rÄ«ku izmantoÅ”anā.

Izpratne par tabulu shēmām

Katrs Apache Spark DataFrame satur shēmu, kas nosaka datu formu, piemēram, datu tipus, kolonnas un metadatus. Izmantojot Delta Lake, tabulas shēma tiek saglabāta JSON formātā darījumu žurnālā.

Kas ir shēmas izpilde?

Shēmas izpilde, kas pazÄ«stama arÄ« kā shēmas validācija, ir Delta Lake droŔības mehānisms, kas nodroÅ”ina datu kvalitāti, noraidot ierakstus, kas neatbilst tabulas shēmai. Tāpat kā saimniece populārā restorāna reÄ£istratÅ«rā, kurā ir tikai rezervācijas, viņa pārbauda, ā€‹ā€‹vai katra tabulā ievadÄ«tā datu kolonna atrodas attiecÄ«gajā paredzamo kolonnu sarakstā (citiem vārdiem sakot, vai katrai no tām ir "rezervācija"). ). un noraida visus ierakstus ar kolonnām, kuras nav sarakstā.

Kā darbojas shēmas izpilde?

Delta Lake izmanto shēmas rakstÄ«Å”anas pārbaudi, kas nozÄ«mē, ka visu jauno ierakstu tabulā tiek pārbaudÄ«ta saderÄ«ba ar mērÄ·a tabulas shēmu rakstÄ«Å”anas laikā. Ja shēma ir nekonsekventa, Delta Lake pilnÄ«bā pārtrauc darÄ«jumu (nav rakstÄ«ti dati) un rada izņēmumu, lai informētu lietotāju par neatbilstÄ«bu.
Delta Lake izmanto Ŕādus noteikumus, lai noteiktu, vai ieraksts ir saderīgs ar tabulu. Rakstāms datu rāmis:

  • nevar saturēt papildu kolonnas, kas nav mērÄ·a tabulas shēmā. Un otrādi, viss ir kārtÄ«bā, ja ienākoÅ”ajos datos nav absolÅ«ti visas tabulas kolonnas - Ŕīm kolonnām vienkārÅ”i tiks pieŔķirtas nulles vērtÄ«bas.
  • nevar bÅ«t kolonnu datu tipi, kas atŔķiras no mērÄ·a tabulas kolonnu datu tipiem. Ja mērÄ·a tabulas kolonnā ir ietverti StringType dati, bet attiecÄ«gajā DataFrame kolonnā ir IntegerType dati, shēmas izpilde radÄ«s izņēmumu un neļaus veikt rakstÄ«Å”anas darbÄ«bu.
  • nevar saturēt kolonnu nosaukumus, kas atŔķiras tikai gadÄ«jumā. Tas nozÄ«mē, ka kolonnas ar nosaukumu "Foo" un "foo" nevar definēt vienā tabulā. Lai gan Spark var izmantot reÄ£istrjutÄ«gā vai reÄ£istrjutÄ«gā (noklusējuma) režīmā, Delta Lake saglabā reÄ£istrjutÄ«gos, bet shēmas krātuvē ir nejutÄ«ga. Parkets ir reÄ£istrjutÄ«gs, saglabājot un atgriežot kolonnu informāciju. Lai izvairÄ«tos no iespējamām kļūdām, datu sabojāŔanas vai datu zuduma (ko mēs personÄ«gi piedzÄ«vojām Databricks), mēs nolēmām pievienot Å”o ierobežojumu.

Lai to ilustrētu, apskatÄ«sim, kas notiek tālāk esoÅ”ajā kodā, mēģinot pievienot dažas tikko Ä£enerētas kolonnas Delta Lake tabulai, kas vēl nav konfigurēta, lai tās pieņemtu.

# Š”Š³ŠµŠ½ŠµŃ€ŠøруŠµŠ¼ 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 uzliek shēmu un pārtrauc rakstÄ«Å”anu. Lai palÄ«dzētu noteikt, kura kolonna (vai kolonnu kopa) izraisa neatbilstÄ«bu, Spark salÄ«dzināŔanai izvada abas shēmas no steka izsekoÅ”anas.

Kāds ir shēmas ievieÅ”anas ieguvums?

Tā kā shēmas izpilde ir diezgan stingra pārbaude, tas ir lielisks rÄ«ks, ko izmantot kā tÄ«ru, pilnÄ«bā pārveidotu datu kopu, kas ir gatava ražoÅ”anai vai patēriņam. Parasti tiek lietots tabulām, kas tieÅ”i baro 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 augsti 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 apļuā€ arhitektÅ«ru, kas savās tabulās pakāpeniski ievieÅ” struktÅ«ru. Lai uzzinātu vairāk par to, varat iepazÄ«ties ar rakstu RažoÅ”anas lÄ«meņa maŔīnmācÄ«ba ar Delta Lake.

Protams, shēmas izpildi var izmantot jebkur jÅ«su konveijerā, taču atcerieties, ka Å”ajā gadÄ«jumā straumÄ“Å”ana uz tabulu var bÅ«t apgrÅ«tinoÅ”a, jo, piemēram, esat aizmirsis, ka ienākoÅ”ajiem datiem pievienojāt citu kolonnu.

Datu atŔķaidÄ«Å”anas novērÅ”ana

Iespējams, tagad jums rodas jautājums, par ko ir tā satraukums? Galu galā dažreiz neparedzēta "shēmas neatbilstÄ«bas" kļūda var traucēt jÅ«su darbplÅ«smai, it Ä«paÅ”i, ja esat iesācējs Delta Lake. Kāpēc gan neļaut shēmai mainÄ«ties pēc vajadzÄ«bas, lai es varētu ierakstÄ«t savu DataFrame neatkarÄ«gi no tā?

Kā saka vecais teiciens, ā€œneviena unce profilakses ir mārciņas vērta ārstÄ“Å”anaiā€. Kādā brÄ«dÄ«, ja neparÅ«pēsities par savas shēmas ievieÅ”anu, datu tipu saderÄ«bas problēmas radÄ«s neglÄ«tas galvas ā€” Ŕķietami viendabÄ«gos neapstrādātos datu avotos var bÅ«t malu gadÄ«jumi, bojātas kolonnas, nepareizi veidoti kartējumi vai citas biedējoÅ”as lietas, par kurām sapņot. murgi. Labākā pieeja ir apturēt Å”os ienaidniekus pie vārtiem ā€” ar shēmas ievieÅ”anu ā€” un rÄ«koties ar tiem gaismā, nevis vēlāk, kad tie sāk slēpties jÅ«su ražoÅ”anas koda tumÅ”ajā dziļumā.

Shēmas izpilde sniedz jums pārliecÄ«bu, ka tabulas shēma nemainÄ«sies, ja vien neapstiprināsit izmaiņas. Tas novērÅ” datu atŔķaidÄ«Å”anu, kas var rasties, ja jaunas kolonnas tiek pievienotas tik bieži, ka iepriekÅ” vērtÄ«gas, saspiestas tabulas zaudē savu nozÄ«mi un lietderÄ«bu datu pārpludināŔanas dēļ. Mudinot jÅ«s bÅ«t apzinātam, noteikt augstus standartus un sagaidÄ«t augstu kvalitāti, shēmas izpilde dara tieÅ”i to, kam tā bija paredzēta ā€” palÄ«dz jums palikt apzinÄ«gam un jÅ«su izklājlapas tÄ«ras.

Ja pēc tālākas apsvērÅ”anas jÅ«s nolemjat, ka jÅ«s patieŔām nepiecieÅ”amÄ«ba pievienot jaunu kolonnu ā€” nekādu problēmu, zemāk ir vienas rindiņas labojums. Risinājums ir ķēdes evolÅ«cija!

Kas ir shēmas evolūcija?

Shēmas evolÅ«cija ir lÄ«dzeklis, kas lietotājiem ļauj viegli mainÄ«t paÅ”reizējo tabulas shēmu atbilstoÅ”i datiem, kas laika gaitā mainās. To visbiežāk izmanto, veicot pievienoÅ”anas vai pārrakstÄ«Å”anas darbÄ«bu, lai automātiski pielāgotu shēmu, iekļaujot tajā vienu vai vairākas jaunas kolonnas.

Kā darbojas shēmas evolūcija?

Ievērojot iepriekŔējās sadaļas piemēru, izstrādātāji var viegli izmantot shēmas evolÅ«ciju, lai pievienotu jaunas kolonnas, kas iepriekÅ” tika noraidÄ«tas shēmas nekonsekvences dēļ. Ķēdes evolÅ«cija tiek aktivizēta, pievienojot .option('mergeSchema', 'true') savai Spark komandai .write ŠøŠ»Šø .writeStream.

# Š”Š¾Š±Š°Š²ŃŒŃ‚Šµ ŠæŠ°Ń€Š°Š¼ŠµŃ‚Ń€ mergeSchema
loans.write.format("delta") 
           .option("mergeSchema", "true") 
           .mode("append") 
           .save(DELTALAKE_SILVER_PATH)

Lai skatītu grafiku, palaidiet Ŕādu 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

Ienirstiet Deltas ezerā: shēmas ievieÅ”ana un attÄ«stÄ«ba
Varat arÄ« iestatÄ«t Å”o opciju visai Spark sesijai, pievienojot spark.databricks.delta.schema.autoMerge = True uz Spark konfigurāciju. Taču izmantojiet to piesardzÄ«gi, jo shēmas izpilde vairs nebrÄ«dinās par netīŔām shēmas neatbilstÄ«bām.

PieprasÄ«jumā iekļaujot parametru mergeSchema, visas kolonnas, kas atrodas DataFrame, bet nav mērÄ·a tabulā, tiek automātiski pievienotas shēmas beigām kā rakstÄ«Å”anas transakcijas daļa. Var pievienot arÄ« ligzdotos laukus, un tie tiks pievienoti arÄ« atbilstoŔās struktÅ«ras kolonnu beigās.

Datuma inženieri un datu zinātnieki var izmantot Å”o opciju, lai esoÅ”ajām maŔīnmācÄ«Å”anās ražoÅ”anas tabulām pievienotu jaunas slejas (iespējams, nesen izsekotu metriku vai Ŕī mēneÅ”a pārdoÅ”anas veiktspējas sleju), nepārkāpjot esoÅ”os modeļus, kuru pamatā ir vecās kolonnas.

Shēmas evolÅ«cijas ietvaros tabulas pievienoÅ”anas vai pārrakstÄ«Å”anas laikā ir atļauts veikt tālāk norādÄ«tos shēmu izmaiņu veidus.

  • Jaunu kolonnu pievienoÅ”ana (Å”is ir visizplatÄ«tākais scenārijs)
  • Datu tipu maiņa no NullType -> jebkura cita veida vai veicināŔana no ByteType -> ShortType -> IntegerType

Citas izmaiņas, kas nav atļautas shēmas evolūcijā, prasa, lai shēma un dati ir jāpārraksta, pievienojot .option("overwriteSchema", "true"). Piemēram, ja kolonna "Foo" sākotnēji bija vesels skaitlis un jaunā shēma bija virknes datu tips, visi Parquet(data) faili būtu jāpārraksta. Šādas izmaiņas ietver:

  • kolonnas dzÄ“Å”ana
  • esoŔās kolonnas datu veida maiņa (uz vietas)
  • pārdēvējot kolonnas, kas atŔķiras tikai reÄ£istros (piemēram, "Foo" un "foo")

Visbeidzot, ar nākamo Spark 3.0 izlaidumu tiks pilnÄ«bā atbalstÄ«ts precÄ«zs DDL (izmantojot ALTER TABLE), ļaujot lietotājiem veikt Ŕādas darbÄ«bas ar tabulu shēmām:

  • pievienojot kolonnas
  • mainot kolonnas komentārus
  • tabulas rekvizÄ«tu iestatÄ«Å”ana, kas kontrolē tabulas darbÄ«bu, piemēram, darÄ«jumu žurnāla glabāŔanas laika iestatÄ«Å”ana.

Kāds ir ķēdes evolūcijas ieguvums?

Shēmas evolÅ«ciju var izmantot jebkurā laikā nodomāt mainiet tabulas shēmu (pretstatā tam, kad nejauÅ”i savam DataFrame pievienojāt kolonnas, kurām tur nevajadzētu bÅ«t). Å is ir vienkārŔākais veids, kā migrēt shēmu, jo tas automātiski pievieno pareizos kolonnu nosaukumus un datu tipus, tos nedeklarējot tieÅ”i.

Secinājums

Shēmas izpilde noraida visas jaunas kolonnas vai citas shēmas izmaiņas, kas nav saderÄ«gas ar jÅ«su tabulu. Nosakot un uzturot Å”os augstos standartus, analÄ«tiÄ·i un inženieri var paļauties, ka viņu datiem ir visaugstākais integritātes lÄ«menis, paziņojot tos skaidri un skaidri, ļaujot viņiem pieņemt labākus biznesa lēmumus.

No otras puses, shēmas evolÅ«cija papildina izpildi, vienkārÅ”ojot apgalvots automātiskas shēmas izmaiņas. Galu galā kolonnas pievienoÅ”anai nevajadzētu bÅ«t sarežģītai.

Shēmas piespiedu pielietojums ir jaņ, kur shēmas evolÅ«cija ir iņ. Lietojot kopā, Ŕīs funkcijas padara trokŔņu slāpÄ“Å”anu un signāla noregulÄ“Å”anu vieglāku nekā jebkad agrāk.

Mēs arÄ« vēlētos pateikties Mukul Murthy un Pranav Anand par viņu ieguldÄ«jumu Å”ajā rakstā.

Citi raksti Å”ajā sērijā:

Ienirstiet Delta ezerā: izpakojiet darījumu žurnālu

Saistītie raksti

RažoÅ”anas lÄ«meņa maŔīnmācÄ«ba ar Delta Lake

Kas ir datu ezers?

Uzziniet vairāk par kursu

Avots: www.habr.com

Pievieno komentāru