Pasinerkite į Deltos ežerą: schemos įgyvendinimas ir evoliucija

Sveiki, Habr! Jūsų dėmesiui pristatau straipsnio vertimą "Nardymas į Deltos ežerą: schemos įgyvendinimas ir evoliucija" autoriai Burak Yavuz, Brenner Heintz ir Denny Lee, kuris buvo parengtas laukiant kurso pradžios Duomenų inžinierius iš OTUS.

Pasinerkite į Deltos ežerą: schemos įgyvendinimas ir evoliucija

Duomenys, kaip ir mūsų patirtis, nuolat kaupiasi ir tobulėja. Kad neatsiliktume, mūsų psichikos pasaulio modeliai turi prisitaikyti prie naujų duomenų, iš kurių kai kurie turi naujų matmenų – naujų būdų stebėti dalykus, apie kuriuos anksčiau nežinojome. Šie psichikos modeliai nedaug skiriasi nuo lentelių schemų, kurios nustato, kaip skirstome į kategorijas ir apdorojame naują informaciją.

Tai priveda prie schemų valdymo klausimo. Laikui bėgant keičiasi verslo iššūkiai ir reikalavimai, keičiasi ir jūsų duomenų struktūra. Delta Lake leidžia lengvai įvesti naujus matavimus keičiantis duomenims. Norėdami valdyti lentelių schemas, vartotojai turi prieigą prie paprastos semantikos. Šios priemonės apima Schema Enforcement, kuri apsaugo vartotojus nuo netyčinio jų lentelių užteršimo klaidomis ar nereikalingais duomenimis, ir Schema Evolution, kuri leidžia automatiškai į atitinkamas vietas įtraukti naujus vertingų duomenų stulpelius. Šiame straipsnyje mes pasinersime į šių įrankių naudojimą.

Lentelių schemų supratimas

Kiekviename „Apache Spark“ duomenų rėmelyje yra schema, apibrėžianti duomenų formą, pvz., duomenų tipus, stulpelius ir metaduomenis. Naudojant Delta Lake, lentelės schema saugoma JSON formatu operacijų žurnale.

Kas yra schemos vykdymas?

Schema Enforcement, taip pat žinomas kaip schemos patvirtinimas, yra Delta Lake saugos mechanizmas, užtikrinantis duomenų kokybę atmesdamas įrašus, kurie neatitinka lentelės schemos. Kaip ir populiaraus, tik rezervuojamo restorano registratūros šeimininkė, ji tikrina, ar kiekvienas į lentelę įvestų duomenų stulpelis yra atitinkamame laukiamų stulpelių sąraše (kitaip tariant, ar kiekvienam iš jų yra „rezervacija“). ). ir atmeta visus įrašus su stulpeliais, kurių sąraše nėra.

Kaip veikia schemos vykdymas?

„Delta Lake“ naudoja schemos rašymo tikrinimą, o tai reiškia, kad visi nauji įrašai į lentelę yra tikrinami dėl suderinamumo su tikslinės lentelės schema rašymo metu. Jei schema nenuosekli, Delta Lake visiškai nutraukia operaciją (duomenys neįrašomi) ir iškelia išimtį, kad praneštų vartotojui apie neatitikimą.
Delta Lake naudoja šias taisykles, kad nustatytų, ar įrašas yra suderinamas su lentele. Rašomas duomenų rėmelis:

  • negali būti papildomų stulpelių, kurių nėra tikslinės lentelės schemoje. Ir atvirkščiai, viskas gerai, jei gaunamuose duomenyse nėra absoliučiai visų lentelės stulpelių – šiems stulpeliams tiesiog bus priskirtos nulinės reikšmės.
  • negali turėti stulpelių duomenų tipų, kurie skiriasi nuo tikslinės lentelės stulpelių duomenų tipų. Jei tiksliniame lentelės stulpelyje yra StringType duomenų, o atitinkamame DataFrame stulpelyje yra sveikojo tipo duomenų, schemos vykdymas padarys išimtį ir neleis atlikti rašymo operacijos.
  • negali būti stulpelių pavadinimų, kurie skiriasi tik didžiosiomis raidėmis. Tai reiškia, kad toje pačioje lentelėje negalite apibrėžti stulpelių pavadinimu „Foo“ ir „foo“. Nors „Spark“ galima naudoti didžiųjų ir mažųjų raidžių skyrimo (numatytuoju) režimu, „Delta Lake“ išsaugo didžiąsias ir mažąsias raides, bet nejautrus schemos saugykloje. Parketas skiria didžiąsias ir mažąsias raides, kai saugo ir grąžina kolonų informaciją. Siekdami išvengti galimų klaidų, duomenų sugadinimo ar duomenų praradimo (to, ką mes asmeniškai patyrėme Databricks), nusprendėme įtraukti šį apribojimą.

Norėdami tai iliustruoti, pažiūrėkime, kas nutinka toliau pateiktame kode, kai bandome įtraukti kai kuriuos naujai sugeneruotus stulpelius į Delta Lake lentelę, kuri dar nesukonfigūruota juos priimti.

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

Užuot automatiškai pridėję naujų stulpelių, Delta Lake nustato schemą ir nustoja rašyti. Kad būtų lengviau nustatyti, kuris stulpelis (arba stulpelių rinkinys) sukelia neatitikimą, „Spark“ išveda abi schemas iš kamino pėdsako palyginimui.

Kokia schemos vykdymo nauda?

Kadangi schemos vykdymas yra gana griežtas patikrinimas, tai puikus įrankis, naudojamas kaip švaraus, visiškai transformuoto duomenų rinkinio, paruošto gamybai ar vartojimui, vartai. Paprastai taikoma lentelėms, kurios tiesiogiai tiekia duomenis:

  • Mašininio mokymosi algoritmai
  • BI prietaisų skydeliai
  • Duomenų analizės ir vizualizacijos įrankiai
  • Bet kuri gamybos sistema, kuriai reikalingos labai struktūrizuotos, stipriai įvestos semantinės schemos.

Norėdami paruošti savo duomenis šiai paskutinei kliūtiei, daugelis vartotojų naudoja paprastą „kelių šuolių“ architektūrą, kuri palaipsniui įveda į savo lenteles struktūrą. Norėdami sužinoti daugiau apie tai, galite perskaityti straipsnį Gamybinio lygio mašininis mokymasis su Delta Lake.

Žinoma, schemos vykdymą galima naudoti bet kurioje konvejerio vietoje, tačiau atminkite, kad srautinis perdavimas į lentelę šiuo atveju gali būti varginantis, nes, pavyzdžiui, pamiršote, kad prie gaunamų duomenų pridėjote kitą stulpelį.

Duomenų praskiedimo prevencija

Iki šiol jums gali kilti klausimas, dėl ko čia tas triukšmas? Galų gale, kartais netikėta „schemos neatitikimo“ klaida gali sutrikdyti jūsų darbo eigą, ypač jei dar nesate Delta Lake. Kodėl gi nepasikeitus schemai, kad galėčiau rašyti savo „DataFrame“, nesvarbu, ką?

Kaip sako senas posakis, „viena uncija prevencijos yra verta svaro išgydymo“. Tam tikru momentu, jei nepasirūpinsite savo schemos vykdymu, duomenų tipų suderinamumo problemos sukels bjaurias galvas – iš pažiūros vienarūšiuose neapdorotų duomenų šaltiniuose gali būti kraštinių atvejų, sugadintų stulpelių, netinkamai suformuotų atvaizdų ar kitų baisių dalykų, apie kuriuos galima svajoti. košmarai. Geriausias būdas yra sustabdyti šiuos priešus prie vartų – įgyvendinant schemą – ir kovoti su jais šviesoje, o ne vėliau, kai jie pradeda slypėti tamsiose jūsų gamybos kodo gelmėse.

Schemos vykdymas suteikia garantiją, kad lentelės schema nepasikeis, nebent patvirtinsite pakeitimą. Taip išvengiama duomenų praskiestimo, kuris gali atsirasti, kai nauji stulpeliai pridedami taip dažnai, kad anksčiau vertingos, suglaudintos lentelės praranda prasmę ir naudingumą dėl duomenų užplūdimo. Skatindama jus būti sąmoningus, nustatyti aukštus standartus ir tikėtis aukštos kokybės, schemos vykdymas atlieka būtent tai, kam buvo sukurtas – padeda išlikti sąžiningiems, o jūsų skaičiuoklės švarios.

Jei toliau apsvarstę nuspręsite, kad tikrai reikia pridėti naują stulpelį – jokių problemų, žemiau yra vienos eilutės pataisymas. Sprendimas yra grandinės evoliucija!

Kas yra schemos evoliucija?

Schemos evoliucija yra funkcija, leidžianti vartotojams lengvai pakeisti esamą lentelės schemą pagal duomenis, kurie keičiasi laikui bėgant. Jis dažniausiai naudojamas atliekant pridėjimo arba perrašymo operaciją, siekiant automatiškai pritaikyti schemą, kad būtų įtrauktas vienas ar daugiau naujų stulpelių.

Kaip veikia schemos evoliucija?

Vadovaudamiesi ankstesnio skyriaus pavyzdžiu, kūrėjai gali lengvai naudoti schemos evoliuciją, kad pridėtų naujų stulpelių, kurie anksčiau buvo atmesti dėl schemos nenuoseklumo. Grandinės evoliucija suaktyvinama pridedant .option('mergeSchema', 'true') į savo „Spark“ komandą .write или .writeStream.

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

Norėdami peržiūrėti grafiką, paleiskite šią Spark SQL užklausą

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

Pasinerkite į Deltos ežerą: schemos įgyvendinimas ir evoliucija
Arba galite nustatyti šią parinktį visai „Spark“ sesijai pridėdami spark.databricks.delta.schema.autoMerge = True į Spark konfigūraciją. Tačiau naudokite tai atsargiai, nes schemos vykdymas nebeįspės jūsų apie netyčinius schemos neatitikimus.

Į užklausą įtraukus parametrą mergeSchema, visi stulpeliai, esantys DataFrame, bet ne tikslinėje lentelėje, automatiškai pridedami prie schemos pabaigos kaip rašymo operacijos dalis. Taip pat galima pridėti įdėtų laukų, kurie taip pat bus įtraukti į atitinkamų struktūros stulpelių pabaigą.

Duomenų inžinieriai ir duomenų mokslininkai gali naudoti šią parinktį norėdami pridėti naujų stulpelių (galbūt neseniai stebėtą metriką arba šio mėnesio pardavimo našumo stulpelį) į esamas mašininio mokymosi gamybos lenteles nepažeisdami esamų modelių, pagrįstų senais stulpeliais.

Toliau išvardytų tipų schemos pakeitimai leidžiami kaip schemos evoliucijos dalis, kai pridedama arba perrašoma lentelė:

  • Naujų stulpelių pridėjimas (tai yra labiausiai paplitęs scenarijus)
  • Duomenų tipų keitimas iš NullType -> bet kurio kito tipo arba reklamavimas iš ByteType -> ShortType -> IntegerType

Kiti schemos evoliucijos neleidžiami pakeitimai reikalauja, kad schema ir duomenys būtų perrašyti pridedant .option("overwriteSchema", "true"). Pavyzdžiui, jei stulpelis „Foo“ iš pradžių buvo sveikasis skaičius, o naujoji schema buvo eilutės duomenų tipas, tada visus „Parquet(data)“ failus reikės perrašyti. Tokie pakeitimai apima:

  • stulpelio ištrynimas
  • esamo stulpelio duomenų tipo keitimas (vietoje)
  • stulpelių, kurie skiriasi tik didžiosiomis raidėmis, pervadinimas (pvz., „Foo“ ir „foo“)

Galiausiai, su kita „Spark 3.0“ versija, aiškus DDL bus visiškai palaikomas (naudojant ALTER TABLE), todėl vartotojai galės atlikti šiuos veiksmus su lentelių schemomis:

  • pridedant stulpelius
  • stulpelių komentarų keitimas
  • lentelės ypatybių, kurios valdo lentelės elgseną, nustatymas, pvz., operacijų žurnalo saugojimo trukmės nustatymas.

Kokia grandinės evoliucijos nauda?

Schemos evoliuciją galite naudoti bet kada ketinti pakeiskite lentelės schemą (priešingai nei tada, kai netyčia į „DataFrame“ įtraukėte stulpelių, kurių ten neturėtų būti). Tai lengviausias būdas perkelti schemą, nes automatiškai pridedami teisingi stulpelių pavadinimai ir duomenų tipai, jų nereikia aiškiai deklaruoti.

išvada

Schemos vykdymas atmeta visus naujus stulpelius ar kitus schemos pakeitimus, kurie nesuderinami su jūsų lentele. Nustatydami ir palaikydami šiuos aukštus standartus, analitikai ir inžinieriai gali pasitikėti, kad jų duomenys yra aukščiausio lygio vientisumo, perduodami juos aiškiai ir aiškiai, todėl gali priimti geresnius verslo sprendimus.

Kita vertus, schemos evoliucija papildo vykdymą supaprastindama tariamas automatiniai schemos keitimai. Juk pridėti stulpelį neturėtų būti sunku.

Priverstinis schemos taikymas yra yang, kur schemos raida yra yin. Naudojant šias funkcijas kartu, triukšmo slopinimas ir signalo derinimas tampa lengvesnis nei bet kada anksčiau.

Taip pat norėtume padėkoti Mukul Murthy ir Pranavui Anandui už jų indėlį į šį straipsnį.

Kiti šios serijos straipsniai:

Pasinerkite į Deltos ežerą: operacijų žurnalo išpakavimas

susiję straipsniai

Gamybinio lygio mašininis mokymasis su Delta Lake

Kas yra duomenų ežeras?

Sužinokite daugiau apie kursą

Šaltinis: www.habr.com

Добавить комментарий