Sukelduge Delta järve: skeemi jõustamine ja areng

Tere Habr! Esitan teie tähelepanu artikli tõlkele "Sukeldumine Delta järve: skeemi jõustamine ja areng" autorid Burak Yavuz, Brenner Heintz ja Denny Lee, mis valmistati ette kursuse alguse ootuses Andmeinsener alates OTUS.

Sukelduge Delta järve: skeemi jõustamine ja areng

Andmeid, nagu ka meie kogemusi, koguneb ja areneb pidevalt. Et sammu pidada, peavad meie vaimsed maailmamudelid kohanema uute andmetega, millest mõned sisaldavad uusi dimensioone – uusi viise jälgida asju, millest meil varem aimugi polnud. Need vaimsed mudelid ei erine palju tabeliskeemidest, mis määravad, kuidas me uut teavet kategoriseerime ja töötleme.

See viib meid skeemihalduse küsimuseni. Kuna ettevõtte väljakutsed ja nõuded muutuvad aja jooksul, muutub ka teie andmete struktuur. Delta Lake muudab uute mõõtmiste kasutuselevõtu andmete muutumisel lihtsaks. Kasutajatel on juurdepääs lihtsale semantikale oma tabeliskeemide haldamiseks. Nende tööriistade hulka kuuluvad Schema Enforcement, mis kaitseb kasutajaid nende tabelite tahtmatu vigade või tarbetute andmetega saastamise eest, ja Schema Evolution, mis võimaldab sobivatesse asukohtadesse automaatselt lisada uusi väärtuslike andmete veerge. Selles artiklis käsitleme nende tööriistade kasutamist põhjalikumalt.

Tabeliskeemide mõistmine

Iga Apache Sparki DataFrame sisaldab skeemi, mis määrab andmete vormi, nagu andmetüübid, veerud ja metaandmed. Delta Lake'i puhul salvestatakse tabeliskeem tehingulogis JSON-vormingus.

Mis on skeemi jõustamine?

Schema Enforcement, tuntud ka kui skeemi valideerimine, on Delta Lake'i turvamehhanism, mis tagab andmete kvaliteedi, lükates tagasi kirjed, mis ei vasta tabeli skeemile. Sarnaselt populaarse ainult broneeringuga restorani vastuvõtulaua perenaine kontrollib ta, kas iga tabelisse sisestatud andmete veerg on vastavas oodatavate veergude loendis (ehk kas igale neist on "reserveering"). ) ja lükkab tagasi kõik veergudega kirjed, mida loendis pole.

Kuidas skeemi jõustamine töötab?

Delta Lake kasutab kirjutamise ajal skeemi kontrollimist, mis tähendab, et kõigi uute tabelisse tehtud kirjutuste puhul kontrollitakse kirjutamise ajal ühilduvust sihttabeli skeemiga. Kui skeem on vastuolus, katkestab Delta Lake tehingu täielikult (andmeid ei kirjutata) ja teeb erandi, et teavitada kasutajat vastuolust.
Delta Lake kasutab järgmisi reegleid, et teha kindlaks, kas kirje ühildub tabeliga. Kirjutatav andmeraam:

  • ei tohi sisaldada täiendavaid veerge, mis pole sihttabeli skeemis. Ja vastupidi, kõik on korras, kui sissetulevad andmed ei sisalda absoluutselt kõiki tabeli veerge - neile veergudele määratakse lihtsalt nullväärtused.
  • ei saa sisaldada veergude andmetüüpe, mis erinevad sihttabeli veergude andmetüüpidest. Kui sihttabeli veerg sisaldab StringType'i andmeid, kuid DataFrame'i vastav veerg sisaldab IntegerType'i andmeid, loob skeemi jõustamine erandi ja takistab kirjutamistoimingu toimumist.
  • ei tohi sisaldada veergude nimesid, mis erinevad ainult juhul. See tähendab, et samas tabelis ei saa määrata veerge nimedega 'Foo' ja 'foo'. Kui Sparki saab kasutada tõstutundlikus või tõstutundlikus (vaike-) režiimis, siis Delta Lake säilitab suur- ja suurtähti, kuid ei ole skeemimälus tundlik. Parkett on sammaste teabe salvestamisel ja tagastamisel tõstutundlik. Võimalike vigade, andmete riknemise või andmete kadumise (mida kogesime Databricksis isiklikult) vältimiseks otsustasime selle piirangu lisada.

Selle illustreerimiseks vaatame, mis juhtub allolevas koodis, kui proovime lisada mõnda äsja loodud veergu Delta Lake'i tabelisse, mis pole veel konfigureeritud neid vastu võtma.

# Сгенерируем 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 lõpetab kirjutamise. Et aidata kindlaks teha, milline veerg (või veergude komplekt) lahknevuse põhjustab, väljastab Spark võrdluseks mõlemad skeemid virnajäljest.

Mis kasu on skeemi jõustamisest?

Kuna skeemi jõustamine on üsna range kontroll, on see suurepärane tööriist puhta, täielikult muudetud andmekogumi väravavahi jaoks, mis on tootmiseks või tarbimiseks valmis. Tavaliselt rakendatakse tabelitele, mis toidavad otse andmeid:

  • Masinõppe algoritmid
  • BI armatuurlauad
  • Andmeanalüüsi ja visualiseerimise tööriistad
  • Igasugune tootmissüsteem, mis nõuab väga struktureeritud, tugevalt tüpiseeritud semantilisi skeeme.

Oma andmete ettevalmistamiseks selle viimase tõkke jaoks kasutavad paljud kasutajad lihtsat mitme hüppega arhitektuuri, mis lisab järk-järgult nende tabelitesse struktuuri. Selle kohta lisateabe saamiseks vaadake artiklit Delta Lake'iga tootmistasemel masinõpe.

Muidugi saab skeemi jõustamist kasutada kõikjal, kuid pidage meeles, et tabelisse voogesitus võib sel juhul olla masendav, sest näiteks unustasite, et lisasite sissetulevatele andmetele veel ühe veeru.

Andmete lahjenemise vältimine

Nüüdseks võite küsida, mille pärast see kära on? Lõppude lõpuks võib mõnikord ootamatu "skeemide mittevastavuse" tõrge teid töövoos segada, eriti kui olete Delta Lake'i uus kasutaja. Miks mitte lasta skeemil vastavalt vajadusele muuta, et saaksin oma DataFrame'i kirjutada ükskõik millest?

Nagu vanasõna ütleb, "üks unts ennetust on väärt tervet ravi." Kui te ei hoolitse oma skeemi jõustamise eest, tõstavad andmetüüpide ühilduvuse probleemid oma inetu peaga – näiliselt homogeensed toorandmeallikad võivad sisaldada servajuhtumeid, rikutud veerge, valesti vormindatud vastendusi või muid hirmutavaid asju, millest unistada. õudusunenäod. Parim viis on peatada need vaenlased väravas – skeemi jõustamise abil – ja tegeleda nendega valguse käes, mitte hiljem, kui nad hakkavad varitsema teie tootmiskoodi hämaras sügavuses.

Skeemi jõustamine annab teile kindluse, et teie tabeli skeem ei muutu, kui te muudatust ei kinnita. See hoiab ära andmete lahjenemise, mis võib tekkida siis, kui uusi veerge lisatakse nii sageli, et varem väärtuslikud tihendatud tabelid kaotavad andmete üleujutuse tõttu oma tähenduse ja kasulikkuse. Julgustades teid olema tahtlik, seadma kõrgeid standardeid ja eeldama kõrget kvaliteeti, teeb skeemi jõustamine täpselt seda, milleks see oli loodud – aitab teil jääda kohusetundlikuks ja teie arvutustabelid puhtaks.

Kui edasisel kaalumisel otsustate, et tõesti kuni lisage uus veerg – pole probleemi, allpool on üherealine parandus. Lahendus on vooluringi areng!

Mis on skeemi areng?

Skeemi areng on funktsioon, mis võimaldab kasutajatel praegust tabeliskeemi hõlpsasti muuta vastavalt aja jooksul muutuvatele andmetele. Seda kasutatakse kõige sagedamini lisamise või ümberkirjutamise toimingu tegemisel, et kohandada skeemi automaatselt ühe või mitme uue veeru lisamiseks.

Kuidas skeemi areng toimib?

Järgides eelmise jaotise näidet, saavad arendajad hõlpsasti kasutada skeemi arengut, et lisada uusi veerge, mis varem skeemi ebaühtluse tõttu tagasi lükati. Vooluahela areng aktiveeritakse lisamise teel .option('mergeSchema', 'true') oma Sparki meeskonnale .write или .writeStream.

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

Graafiku vaatamiseks käivitage 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

Sukelduge Delta järve: skeemi jõustamine ja areng
Teise võimalusena saate lisada selle valiku kogu Sparki seansi jaoks spark.databricks.delta.schema.autoMerge = True Sparki konfiguratsioonile. Kuid kasutage seda ettevaatlikult, kuna skeemi jõustamine ei hoiata teid enam tahtmatute skeemi vastuolude eest.

Lisades parameetri päringusse mergeSchema, lisatakse kõik veerud, mis on olemas DataFrame'is, kuid mitte sihttabelis, kirjutamistehingu osana automaatselt skeemi lõppu. Lisada saab ka pesastatud välju ja need lisatakse ka vastava struktuuri veergude lõppu.

Kuupäevainsenerid ja andmeteadlased saavad seda suvandit kasutada uute veergude (võib-olla hiljuti jälgitud mõõdiku või selle kuu müügitulemuste veergu) lisamiseks olemasolevatele masinõppe tootmistabelitele, ilma vanadel veergudel põhinevaid olemasolevaid mudeleid purustamata.

Tabeli lisamise või ümberkirjutamise ajal on skeemi arendamise osana lubatud järgmist tüüpi skeemi muudatused.

  • Uute veergude lisamine (see on kõige levinum stsenaarium)
  • Andmetüüpide muutmine tüübist NullType -> mis tahes muu tüüp või reklaamimine jaotisest ByteType -> ShortType -> IntegerType

Muud muudatused, mis pole skeemi arengus lubatud, nõuavad skeemi ja andmete ümberkirjutamist lisamise teel .option("overwriteSchema", "true"). Näiteks juhul, kui veerg "Foo" oli algselt täisarv ja uus skeem oli stringi andmetüüp, tuleb kõik Parquet(data) failid ümber kirjutada. Sellised muudatused hõlmavad järgmist:

  • veeru kustutamine
  • olemasoleva veeru andmetüübi muutmine (kohas)
  • veergude ümbernimetamine, mis erinevad ainult tähtede korral (näiteks "Foo" ja "foo")

Lõpuks, Spark 3.0 järgmise väljalaskega toetatakse täielikult selgesõnalist DDL-i (kasutades ALTER TABLE), mis võimaldab kasutajatel teha tabeliskeemidega järgmisi toiminguid.

  • veergude lisamine
  • veergude kommentaaride muutmine
  • tabeli atribuutide seadmine, mis juhivad tabeli käitumist, nt tehingulogi salvestamise aja määramine.

Mis kasu on vooluringi arengust?

Skeemi evolutsiooni saab kasutada igal ajal kavatsema muutke oma tabeli skeemi (erinevalt sellest, kui lisasite kogemata DataFrame'i veerge, mida seal ei tohiks olla). See on lihtsaim viis skeemi üleviimiseks, kuna see lisab automaatselt õiged veergude nimed ja andmetüübid, ilma et peaks neid selgesõnaliselt deklareerima.

Järeldus

Skeemi jõustamine lükkab tagasi kõik uued veerud või muud skeemimuudatused, mis teie tabeliga ei ühildu. Nende kõrgete standardite kehtestamisel ja säilitamisel saavad analüütikud ja insenerid usaldada, et nende andmete terviklikkus on kõrgeim, edastades need selgelt ja selgelt, võimaldades neil teha paremaid äriotsuseid.

Teisest küljest täiendab skeemi areng jõustamist lihtsustades väidetavalt automaatsed skeemimuutused. Lõppude lõpuks ei tohiks veeru lisamine olla keeruline.

Skeemi sundrakenduseks on yang, kus skeemi areng on yin. Koos kasutades muudavad need funktsioonid mürasummutuse ja signaali häälestamise lihtsamaks kui kunagi varem.

Samuti soovime tänada Mukul Murthyt ja Pranav Anandit nende panuse eest sellesse artiklisse.

Teised selle sarja artiklid:

Sukelduge Delta järve: tehingulogi lahtipakkimine

Seotud artiklid

Delta Lake'iga tootmistasemel masinõpe

Mis on andmejärv?

Uuri kursuse kohta lähemalt

Allikas: www.habr.com

Lisa kommentaar