Tere, Habr! Esitan teile artikli tõlke autorid Burak Yavuz, Brenner Heintz ja Denny Lee, mis koostati kursuse alguse eel OTUSelt.

Andmed, nagu ka meie kogemus, kogunevad ja arenevad pidevalt. Et mitte mahajääda, peavad meie vaimsed mudelid maailmast kohanduma uute andmetega, millest mõned hõlmavad uusi mõõtmeid - uusi viise tähelepanekute tegemiseks asjadest, millest varem polnud meil aimugi. Need vaimsed mudelid ei erine eriti tabeliskeemidest, mis määratlevad, kuidas me klassifitseerime ja töötleme uut teavet.
See viib meid skeemihalduse küsimuse juurde. Aja möödudes muutuvad äriülesanded ja nõuded, millega muutub ka teie andmete struktuur. Delta Lake võimaldab uute mõõtmete hõlpsat rakendamist andmete muutmisel. Kasutajatel on lihtne semantika oma tabelite skeemide haldamiseks. Need tööriistad hõlmavad skeemi sundrakendamist (Schema Enforcement), mis kaitseb kasutajaid nende tabelite ekslikest või mittevajalikest andmetest põhjustatud saastumise eest, ning skeemi arengut (Schema Evolution), mis võimaldab automaatselt lisada uusi veerge väärtuslike andmetega asjakohastesse kohtadesse. Selles artiklis süveneme nende tööriistade kasutamisse.
Tabeli skeemide mõistmine
Iga DataFrame Apache Sparkis sisaldab skeemi, mis määratleb andmete kuju, näiteks andmetüübid, veerud ja metaandmed. Delta Lake'i puhul salvestatakse tabeli skeem JSON-formaadis tehingute ajaloos.
Mis on skeemi sundrakendamine?
Schema Enforcement, tuntud ka kui skeemi valideerimine, on kaitsemehhanism Delta Lake'is, mis tagab andmete kvaliteedi, tõrjudes salvestusi, mis ei vasta tabeli skeemile. Nagu hostes populaarses restoranis, kes võtab vastu ainult eelnevalt broneeritud, kontrollib see, kas iga tabelisse sisestatava andmeveeru puhul on olemas vastav oodatud veergude nimekiri (teisisõnu, kas sellel on igaühe jaoks «broneering»), ja tõrjub kõik salvestused, kus veerge, mis nimekirjas ei ole.
Kuidas schema enforcement töötab?
Delta Lake kasutab skeemi kontrollimist kirje kirjutamisel, mis tähendab, et kõik uued salvestused tabelisse kontrollitakse sihttabeli skeemiga kooskõlas olemise osas kirjutamise ajal. Kui skeem ei ole ühilduv, tühistab Delta Lake täielikult tehingu (andmeid ei kirjutata) ja tekitab erandi, et teavitada kasutajat vastuolust.
Delta Lake kasutab kirje ühilduvuse määramiseks järgmisi reegleid. Salvestatav DataFrame:
- ei saa sisaldada täiendavaid veerge, mida sihttabeli skeem ei hõlma. Ja vastupidi, kõik on korras, kui sisendandmed ei sisalda absoluutselt kõiki tabeli veerge — need veerud saavad lihtsalt nullväärtused.
- ei saa omada veergude andmetüüpe, mis erinevad sihttabeli veergude andmetüüpidest. Kui sihttabeli veerg sisaldab StringType andmeid, kuid vastav veerg DataFrame'is sisaldab IntegerType andmeid, põhjustab skeemi sundrakendamine erandi ja takistab kirjutamisoperatsiooni täitmist.
- ei saa sisaldada veergude nimesid, mis erinevad ainult suurusest. See tähendab, et te ei saa omada veerge, mille nimed on ‘Foo’ ja ‘foo’, määratletud ühes tabelis. Kuigi Spark’i saab kasutada tundliku või tundetu (vaikimisi) režiimi korral, säilitab Delta Lake suure, kuid on tundetu skeemi salvestamise raames. Parquet on tundlik suuruse poolest veergude andmete salvestamisel ja tagastamisel. Võimalike vigade, andmete kahjustumise või nende kadumise vältimiseks (millega oleme isiklikult Databricks'is silmitsi seisnud) otsustasime lisada selle piirangu.
Kuna illustreerida, vaatame, mis toimub allolevas koodis, kui proovime lisada mõned hiljuti genereeritud veerud Delta Lake tabelisse, mis pole nende vastuvõtmiseks veel seadistatud.
# Сгенерируем 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.Uute veergude automaatse lisamise asemel kehtestab Delta Lake skeemi ja peatab kirje. Et aidata välja selgitada, milline veerg (või mitu) põhjustab ebakõla, väljastab Spark võrreldamiseks mõlema skeemi stack trace'i.
Milline on skeemi sundrakendamise kasu?
Kuna skeemi sundrakendamine on piisavalt ranged kontroll, on see suurepärane tööriist, mida kasutada puhta, täielikult muudetud andmestiku väravas, mis on valmis tootmiseks või tarbimiseks. Tavaliselt rakendatakse seda tabelitele, mis otse tõid andmeid:
- Masinõppe algoritmid
- BI juhtpaneelid
- Andmeanalüüs ja visualiseerimistööriistad
- Mis tahes tootmissüsteem, mis vajab rangelt struktureeritud, rangelt tüpiseeritud semantilisi skeeme.
Ettevalmistamiseks oma andmeid sellele viimasele barjääri paljud kasutajad rakendavad lihtsat "multi-hop" arhitektuuri, mis järk-järgult lisab struktuuri nende tabelitesse. Lisainformatsiooni saamiseks võite tutvuda artikliga
Muidugi, sunnitud skeemi rakendamist saab kasutada igal kohal teie andmestikus, kuid pidage meeles, et voogesitus tabelisse sellisel juhul võib olla tülikas, kuna näiteks te unustasite, et lisasite veel ühe veeru sisendandmetesse.
Andmete lahjendamise ennetamine
Selle hetke seisuga võite küsida, miks selline elevus? Lõppude lõpuks võib mõnikord ootamatu "skeemi mittevastavuse" viga segada teie tööprotsessi, eriti kui olete Delta Lake'iga uus. Miks mitte lihtsalt lubada skeemil muutuda nii, nagu on vajalik, et ma saaksin mõlemad salvestada oma DataFrame’i, hoolimata kõigest?
Vanalt öeldakse, et «tass ennetust maksab naela ravi». Ühel hetkel, kui te ei hooli oma skeemi rakendamisest, tõusevad andmetüüpidega seotud probleemid — esmapilgul ühtlaselt näivad toorandmeallikad võivad sisaldada äärmuslikke juhtumeid, kahjustatud veerge, valesti vormindatud seoseid või muid kohutavaid asju, mis külastavad õudusunenägusid. Parim lähenemine on peatada need vaenlased väravas — sundides skeemi rakendama — ja tegeleda nendega päevavalgele, mitte hiljem, kui nad hakkavad hiilima teie töökoodeksi pimedatesse sügavustesse.
Skeemi sundrakendamine tagab, et teie tabeli struktuur ei muutu, kui te ise ei kinnita muudatust. See takistab andmete 'lahjendamist', mis võib toimuda, kui uusi veerge lisatakse liiga tihti, mistõttu varem väärtuslikud, kokkusurutud tabelid kaotavad oma väärtuse ja kasulikkuse andmemere tõttu. Sundrakendamine julgustab teid olema teadlik, seadma kõrgeid standardeid ja ootama kõrge kvaliteediga, tehes seda täpselt selleks, milleks see oli mõeldud — aitama teil jääda ausaks ja teie tabelitel puhtaks.
Kui edasise arutelu käigus otsustate, et soovite tegelikult vaja lisada uue veeru — pole probleemi, allpool on ühe rea lahendus. Lahendus on skeemi evolutsioon!
Mis on skeemi evolutsioon?
Schémade evolutsioon on funktsioon, mis võimaldab kasutajatel kergesti muuta tabeli praegust skeemi vastavalt andmetele, mis aja jooksul muutuvad. Seda kasutatakse kõige sagedamini lisamise või üle kirjutamise operatsiooni käigus, et skeemi automaatselt kohandada, et lisada üks või mitu uut veergu.
Kuidas schémade evolutsioon töötab?
Jätkates eelnevas jaotises toodud näidet, saavad arendajad kergesti kasutada schémade evolutsiooni uute veergude lisamiseks, mis olid varem skeemiga kokkusobimatuse tõttu tagasi lükatud. Schémade evolutsioon aktiveeritakse, lisades .option('mergeSchema', 'true') teie Spark komandole .write või .writeStream.
# Добавьте параметр mergeSchema
loans.write.format("delta")
.option("mergeSchema", "true")
.mode("append")
.save(DELTALAKE_SILVER_PATH)Graafiku vaatamiseks tehke järgmine Spark SQL päring
# Создайте график с новым столбцом, чтобы подтвердить, что запись прошла успешно
%sql
SELECT addr_state, sum(`amount`) AS amount
FROM loan_by_state_delta
GROUP BY addr_state
ORDER BY sum(`amount`)
DESC LIMIT 10 
Alternatiivselt saate selle valiku seada kogu Spark seansi jaoks, lisades spark.databricks.delta.schema.autoMerge = True Spark konfiguratsioonile. Kuid kasutage seda ettevaatlikult, kuna skeemi sundrakendamine ei hoiatada teid enam ettenägematute skeemide vastuolude eest.
Kuna päringus on parameeter mergeSchema, kõik DataFrame'is olemasolevad, kuid sihttabelis puuduvad veerud lisatakse automaatselt skeemi lõppu kirjutamise tehingu käigus. Samuti võivad olla lisatud sisemised väljad, ja need lisatakse ka vastavate veergude struktuuri lõppu.
Kuupäevainsenerid ja teadlased saavad kasutada seda valikut, et lisada uusi veerge (võimalik uudse jälgitav mõõdik või müügimäärad selle kuu veerg) oma olemasolevatesse masinõppe tootmistabelitesse, ilma et varasemate veergude põhjal põhinevad mudelid oleksid katki.
Alljärgnevad skeemi muudatuste tüübid on lubatud skeemi evolutsiooni käigus tabeli lisamisel või kirjutamisel:
- Uute veergude lisamine (see on kõige levinum stsenaarium)
- Andmetüübi muutmine NullType'ist -> mis tahes muusse tippu või tõstmine ByteType'ist -> ShortType'ist -> IntegerType'ist
Muud muudatused, mis ei ole skeemi evolutsiooni raames lubatud, nõuavad, et skeem ja andmed tuleb ümber kirjutada, lisades .option("overwriteSchema", "true"). Näiteks juhul, kui veerg „Foo” oli algselt täisarv ja uus skeem oleks olnud stringi andmetüüp, oleks kõiki Parquet-faile (andmed) pidanud üle kirjutama. Selliste muutuste hulka kuuluvad:
- veeru eemaldamine
- olemasoleva veeru andmetüübi muutmine (kohapeal)
- veergude ümbernimetamine, mis erinevad vaid suur- ja väiketähtede poolest (näiteks „Foo” ja „foo”)
Lõpuks toetab järgmise Spark 3.0 väljaandega täielikult selges DDL-i (kasutades ALTER TABLE), mis võimaldab kasutajatel teostada järgmisi toiminguid tabelite skeemidega:
- veergude lisamine
- veergude kommentaaride muutmine
- tabeli omaduste kohandamine, mis määravad tabeli käitumise, näiteks tehinguajakava säilivuse määramine.
Milline on skeemi arengu eelised?
Skeemi arendamist saab kasutada alati, kui te kavatsete muuda oma tabeli skeemi (vastupidiselt juhtumitele, kus olete kogemata lisanud oma DataFrame'i veerge, mida seal ei tohiks olla). See on kõige lihtsam viis oma skeemi migreerimiseks, kuna see lisab automaatselt õiged veerunimed ja andmetüübid ilma nende selgesõnalise kuulutamiseta.
Kokkuvõte
Skeemi sundrakendamine lükkab tagasi kõik uued veerud või muud skeemi muudatused, mis ei ühti teie tabeliga. Seades ja säilitades need kõrged standardid, saavad analüütikud ja insenerid tugineda oma andmete kõrgeimale kvaliteedile, mõeldes sellele selgelt ja arusaadavalt, mis võimaldab neil teha efektiivsemaid äriotsuseid.
Teisest küljest täiendab skeemi evolutsioon sundrakendamist, lihtsustades eeldatavad automaatseid skeemi muudatusi. Lõppude lõpuks ei tohiks see olla keeruline — lisada veerg.
Skeemi sundrakendamine on jänes, kus skeemi evolutsioon on yin. Koos kasutamisel lihtsustavad need funktsioonid nagu kunagi varem müra allasurumist ja signaali seadmist.
Soovime samuti tänada Mukula Murti ja Pranava Ananda nende panuse eest sellesse artiklisse.
Teised artiklid sellest sarjast:

Seotud artiklid
Allikas: habr.com
