Delta Lake Dive: Enforcement and Scheme Evolution

Hæ Habr! Ég kynni þér þýðingu greinarinnar "Diving Into Delta Lake: Schema Enforcement & Evolution" höfundarnir Burak Yavuz, Brenner Heintz og Denny Lee, sem var undirbúið í aðdraganda námskeiðsins. "gagnaverkfræðingur" frá OTUS.

Delta Lake Dive: Enforcement and Scheme Evolution

Gögn, eins og reynsla okkar, safnast stöðugt upp og þróast. Til að halda í við verða hugarlíkön okkar af heiminum að laga sig að nýjum gögnum, sem sum innihalda nýjar víddir – nýjar leiðir til að fylgjast með hlutum sem við höfðum ekki hugmynd um áður. Þessi andlegu líkön eru ekki mikið frábrugðin töfluskemunum sem ákvarða hvernig við flokkum og vinnum nýjar upplýsingar.

Þetta leiðir okkur að spurningunni um kerfisstjórnun. Þar sem áskoranir og kröfur fyrirtækja breytast með tímanum breytist uppbygging gagna þinna líka. Delta Lake gerir það auðvelt að kynna nýjar mælingar þegar gögn breytast. Notendur hafa aðgang að einfaldri merkingarfræði til að stjórna töfluskemanum sínum. Þessi verkfæri eru ma Schema Enforcement, sem verndar notendur gegn óviljandi mengun töflur þeirra með villum eða óþarfa gögnum, og Schema Evolution, sem gerir kleift að bæta nýjum dálkum af verðmætum gögnum sjálfkrafa á viðeigandi staði. Í þessari grein munum við kafa dýpra í notkun þessara verkfæra.

Skilningur á töflukerfum

Hver DataFrame í Apache Spark inniheldur skema sem skilgreinir form gagna, svo sem gagnategundir, dálka og lýsigögn. Með Delta Lake er töfluskemað geymt á JSON sniði inni í viðskiptaskránni.

Hvað er kerfisframkvæmd?

Schema Enforcement, einnig þekkt sem Schema Validation, er öryggiskerfi í Delta Lake sem tryggir gagnagæði með því að hafna skrám sem passa ekki við skema töflunnar. Eins og gestgjafinn í afgreiðslu vinsæls veitingahúss sem eingöngu er pantað, athugar hún hvort hver dálkur af gögnum sem færður er inn í töfluna sé í samsvarandi lista yfir væntanlega dálka (með öðrum orðum hvort það sé "pöntun" fyrir hvern þeirra ), og hafnar öllum færslum með dálkum sem eru ekki á listanum.

Hvernig virkar kerfisframkvæmd?

Delta Lake notar schema-on-write athugun, sem þýðir að öll ný skrif í töfluna eru skoðuð með tilliti til samhæfni við skema marktöflunnar við ritun. Ef stefið er ósamræmi hættir Delta Lake viðskiptunum algjörlega (engin gögn eru skrifuð) og vekur undantekningu til að tilkynna notandanum um ósamræmið.
Delta Lake notar eftirfarandi reglur til að ákvarða hvort skrá sé samhæf við töflu. Skrifanlegur gagnarammi:

  • getur ekki innihaldið viðbótardálka sem eru ekki í skema marktöflunnar. Aftur á móti er allt í lagi ef gögnin sem berast innihalda ekki algerlega alla dálka úr töflunni - þessum dálkum verður einfaldlega úthlutað núllgildum.
  • getur ekki haft dálkagagnategundir sem eru frábrugðnar gagnategundum dálkanna í marktöflunni. Ef marktöfludálkurinn inniheldur StringType gögn, en samsvarandi dálkur í DataFrame inniheldur IntegerType gögn, mun stefnuframkvæmd koma frá sér undantekningu og koma í veg fyrir að skrifaaðgerðin eigi sér stað.
  • getur ekki innihaldið dálkanöfn sem eru aðeins mismunandi í tilfellum. Þetta þýðir að þú getur ekki haft dálka sem heita 'Foo' og 'foo' skilgreinda í sömu töflu. Þó að Spark sé hægt að nota í hástöfum eða hástöfum eða hástöfum (sjálfgefnu) ham, er Delta Lake varðveitt til að varðveita hástafi en er ónæmir innan skemageymslunnar. Parket er hástafaviðkvæmt við geymslu og skil á dálkaupplýsingum. Til að forðast hugsanlegar villur, gagnaspillingu eða gagnatap (eitthvað sem við upplifðum persónulega hjá Databricks) ákváðum við að bæta þessari takmörkun við.

Til að útskýra þetta skulum við skoða hvað gerist í kóðanum hér að neðan þegar við reynum að bæta nokkrum nýbúnum dálkum við Delta Lake töflu sem er ekki enn stillt til að samþykkja þá.

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

Í stað þess að bæta sjálfkrafa við nýjum dálkum, setur Delta Lake skema og hættir að skrifa. Til að hjálpa til við að ákvarða hvaða dálkur (eða sett af dálkum) veldur ósamræminu, gefur Spark bæði stefin út úr staflanum til samanburðar.

Hver er ávinningurinn af því að framfylgja skema?

Vegna þess að kerfisframkvæmd er nokkuð ströng athugun er hún frábært tæki til að nota sem hliðvörð að hreinu, fullkomlega umbreyttu gagnasetti sem er tilbúið til framleiðslu eða neyslu. Venjulega notað á töflur sem beint mata gögn:

  • Vélræn reiknirit
  • BI mælaborð
  • Gagnagreiningar- og sjónræn verkfæri
  • Sérhvert framleiðslukerfi sem krefst mjög uppbyggðra, sterklega vélritaðra merkingarskema.

Til að undirbúa gögnin sín fyrir þessa síðustu hindrun nota margir notendur einfaldan „multi-hop“ arkitektúr sem smám saman kynnir uppbyggingu inn í töflurnar sínar. Til að læra meira um þetta geturðu skoðað greinina Vélnám í framleiðslustigi með Delta Lake.

Auðvitað er hægt að nota stefnuframkvæmd hvar sem er í leiðslunni þinni, en mundu að streymi í töflu í þessu tilfelli getur verið pirrandi vegna þess að þú gleymdir til dæmis að þú bættir öðrum dálki við innkomin gögn.

Koma í veg fyrir þynningu gagna

Núna ertu kannski að velta fyrir þér, hvað er allt lætin um? Þegar öllu er á botninn hvolft, stundum getur óvænt „skemumisræmi“ villa komið þér fyrir í vinnuflæðinu, sérstaklega ef þú ert nýr í Delta Lake. Af hverju ekki bara að láta skemað breytast eftir þörfum svo að ég geti skrifað DataFrame minn, sama hvað?

Eins og gamla orðatiltækið segir, "Aura af forvörnum er þess virði að lækna. Á einhverjum tímapunkti, ef þú gætir þess ekki að framfylgja skemanu þínu, munu vandamál með samhæfni gagnategunda vekja ljótan haus - að því er virðist einsleitar hráar gagnaheimildir geta innihaldið jaðartilvik, skemmda dálka, vansköpuð kortlagningu eða annað skelfilegt til að dreyma um í martraðir. Besta aðferðin er að stöðva þessa óvini við hliðið - með framfylgni skema - og takast á við þá í ljósi, frekar en seinna þegar þeir byrja að leynast í myrku djúpinu í framleiðslukóðanum þínum.

Að framfylgja skema gefur þér fullvissu um að skema töflunnar þinnar breytist ekki nema þú samþykkir breytinguna. Þetta kemur í veg fyrir þynningu gagna, sem getur átt sér stað þegar nýjum dálkum er bætt við svo oft að áður verðmætar, þjappaðar töflur missa merkingu sína og notagildi vegna gagnaflæðis. Með því að hvetja þig til að vera viljandi, setja háar kröfur og búast við hágæða, gerir kerfisframkvæmd nákvæmlega það sem hún var hönnuð til að gera - hjálpar þér að vera samviskusamur og töflureiknarnir þínir hreinir.

Ef við nánari athugun ákveður þú að þú raunverulega þarf bæta við nýjum dálki - ekkert mál, hér að neðan er einlínu lagfæring. Lausnin er þróun hringrásarinnar!

Hvað er skemaþróun?

Skema þróun er eiginleiki sem gerir notendum kleift að breyta núverandi töfluskema auðveldlega í samræmi við gögn sem breytast með tímanum. Það er oftast notað þegar verið er að bæta við eða endurskrifa aðgerð til að aðlaga skema sjálfkrafa til að innihalda einn eða fleiri nýja dálka.

Hvernig virkar skemaþróun?

Með því að fylgja dæminu frá fyrri hlutanum geta verktaki auðveldlega notað skemaþróun til að bæta við nýjum dálkum sem áður var hafnað vegna ósamræmis skema. Hringrásarþróun er virkjuð með því að bæta við .option('mergeSchema', 'true') til Spark liðsins þíns .write или .writeStream.

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

Til að skoða línuritið skaltu keyra eftirfarandi Spark SQL fyrirspurn

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

Delta Lake Dive: Enforcement and Scheme Evolution
Að öðrum kosti geturðu stillt þennan valkost fyrir alla Spark lotuna með því að bæta við spark.databricks.delta.schema.autoMerge = True í Spark stillinguna. En notaðu þetta með varúð, þar sem framfylgd skema mun ekki lengur vara þig við óviljandi ósamræmi í skema.

Með því að setja færibreytuna inn í beiðnina mergeSchema, öllum dálkum sem eru til staðar í DataFrame en ekki í marktöflunni er sjálfkrafa bætt við lok skemasins sem hluti af skriffærslu. Einnig er hægt að bæta við hreiðri reitum og þeim verður einnig bætt við í lok samsvarandi dálka uppbyggingar.

Dagsetningarverkfræðingar og gagnafræðingar geta notað þennan valmöguleika til að bæta nýjum dálkum (kannski nýlega mældum mælikvarða eða söluárangursdálki þessa mánaðar) við núverandi vélanámsframleiðslutöflur þeirra án þess að brjóta núverandi líkön byggð á gömlum dálkum.

Eftirfarandi gerðir skemabreytinga eru leyfðar sem hluti af skemaþróun meðan á töflu er bætt við eða endurskrifað:

  • Nýjum dálkum bætt við (þetta er algengasta atburðarásin)
  • Að breyta gagnategundum úr NullType -> hvaða annarri gerð sem er eða kynna frá ByteType -> ShortType -> IntegerType

Aðrar breytingar sem ekki eru leyfðar innan skemaþróunar krefjast þess að stefið og gögnin séu endurskrifuð með því að bæta við .option("overwriteSchema", "true"). Til dæmis, ef dálkurinn „Foo“ var upphaflega heiltala og nýja skemað var strengjagagnategund, þá þyrfti að endurskrifa allar Parquet(gögn) skrár. Slíkar breytingar eru ma:

  • að eyða dálki
  • breyta gagnagerð núverandi dálks (á sínum stað)
  • endurnefna dálka sem eru aðeins frábrugðnar í föllum (til dæmis "Foo" og "foo")

Að lokum, með næstu útgáfu af Spark 3.0, verður skýr DDL að fullu studd (með því að nota ALTER TABLE), sem gerir notendum kleift að framkvæma eftirfarandi aðgerðir á töfluskema:

  • að bæta við dálkum
  • breyta dálka athugasemdum
  • að setja töflueiginleika sem stjórna hegðun töflunnar, svo sem að stilla tímalengd færsluskrár er geymd.

Hver er ávinningurinn af hringrásarþróun?

Skema þróun er hægt að nota hvenær sem þú ætla breyttu skema töflunnar þinnar (öfugt við þegar þú bættir óvart dálkum við DataFrame sem ættu ekki að vera þar). Þetta er auðveldasta leiðin til að flytja stefið þitt vegna þess að það bætir sjálfkrafa við réttum dálknöfnum og gagnategundum án þess að þurfa að lýsa yfir þeim sérstaklega.

Ályktun

Framfylgd skema hafnar öllum nýjum dálkum eða öðrum skemabreytingum sem eru ekki samhæfðar töflunni þinni. Með því að setja og viðhalda þessum háu stöðlum geta greiningaraðilar og verkfræðingar treyst því að gögn þeirra hafi hæsta stigi heiðarleika, miðla þeim skýrt og skýrt, sem gerir þeim kleift að taka betri viðskiptaákvarðanir.

Á hinn bóginn bætir skemaþróun við framfylgd með því að einfalda meint sjálfvirkar skemabreytingar. Enda ætti ekki að vera erfitt að bæta við dálki.

Þvinguð beiting kerfisins er yang, þar sem þróun kerfisins er yin. Þegar þeir eru notaðir saman gera þessir eiginleikar hávaðabælingu og merkjastillingu auðveldari en nokkru sinni fyrr.

Við viljum líka þakka Mukul Murthy og Pranav Anand fyrir framlag þeirra til þessarar greinar.

Aðrar greinar í þessari röð:

Kafa í Delta Lake: Taka upp viðskiptaskrána

Tengdar greinar

Vélnám í framleiðslustigi með Delta Lake

Hvað er gagnavatn?

Kynntu þér námskeiðið nánar

Heimild: www.habr.com

Bæta við athugasemd