Ħej Habr! Nippreżenta għall-attenzjoni tiegħek it-traduzzjoni tal-artiklu
Id-dejta, bħall-esperjenza tagħna, qed takkumula u tevolvi kontinwament. Biex ilaħħqu, il-mudelli mentali tagħna tad-dinja jridu jadattaw għal dejta ġdida, li xi wħud minnhom fihom dimensjonijiet ġodda—modi ġodda taʼ kif nosservaw affarijiet li qabel ma kellniex idea dwarhom. Dawn il-mudelli mentali mhumiex ħafna differenti mill-iskemi tat-tabella li jiddeterminaw kif nikkategorizzaw u nipproċessaw informazzjoni ġdida.
Dan iwassalna għall-kwistjoni tal-ġestjoni tal-skema. Hekk kif l-isfidi u r-rekwiżiti tan-negozju jinbidlu maż-żmien, l-istruttura tad-dejta tiegħek ukoll qed tinbidel. Delta Lake jagħmilha faċli li tintroduċi kejl ġdid hekk kif tinbidel id-dejta. L-utenti għandhom aċċess għal semantika sempliċi biex jimmaniġġjaw l-iskemi tat-tabella tagħhom. Dawn l-għodod jinkludu l-Infurzar tal-Iskema, li tipproteġi lill-utenti milli jniġġsu t-tabelli tagħhom b'mod mhux intenzjonat bi żbalji jew dejta mhux meħtieġa, u Evoluzzjoni tal-Iskema, li tippermetti li kolonni ġodda ta 'dejta siewja jiġu miżjuda awtomatikament mal-postijiet xierqa. F'dan l-artikolu, aħna ser ngħaddu aktar fil-fond fl-użu ta 'dawn l-għodod.
Fehim ta' Skemi ta' Tabella
Kull DataFrame f'Apache Spark fih skema li tiddefinixxi l-forma tad-dejta, bħal tipi ta' dejta, kolonni u metadejta. B'Delta Lake, l-iskema tat-tabella hija maħżuna fil-format JSON ġewwa r-reġistru tat-tranżazzjonijiet.
X'inhu l-infurzar tal-iskema?
L-Infurzar tal-Iskema, magħruf ukoll bħala Validazzjoni tal-Iskema, huwa mekkaniżmu ta' sigurtà f'Delta Lake li jiżgura l-kwalità tad-dejta billi jirrifjuta r-rekords li ma jaqblux mal-iskema tat-tabella. Bħall-hostess fuq il-front desk ta’ ristorant popolari ta’ riservazzjoni biss, hija tiċċekkja jekk kull kolonna ta’ dejta mdaħħla fit-tabella hijiex fil-lista korrispondenti ta’ kolonni mistennija (fi kliem ieħor, jekk hemmx "riservazzjoni" għal kull waħda minnhom ). u tirrifjuta kwalunkwe rekord b'kolonni li mhumiex fil-lista.
Kif jaħdem l-infurzar tal-iskema?
Delta Lake juża l-iċċekkjar tal-skema fuq il-kitba, li jfisser li l-kitbiet ġodda kollha fuq it-tabella jiġu ċċekkjati għall-kompatibbiltà mal-iskema tat-tabella fil-mira fil-ħin tal-kitba. Jekk l-iskema hija inkonsistenti, Delta Lake twaqqaf it-tranżazzjoni għal kollox (l-ebda dejta mhi miktuba) u tqajjem eċċezzjoni biex tinnotifika lill-utent bl-inkonsistenza.
Delta Lake tuża r-regoli li ġejjin biex tiddetermina jekk rekord huwiex kompatibbli ma 'tabella. DataFrame li jista' jinkiteb:
- ma jistax ikun fih kolonni addizzjonali li mhumiex fl-iskema tat-tabella fil-mira. Bil-maqlub, kollox huwa tajjeb jekk id-dejta li tidħol ma jkunx fiha assolutament il-kolonni kollha mit-tabella - dawn il-kolonni sempliċement jiġu assenjati valuri nulli.
- ma jistax ikollu tipi ta' dejta ta' kolonni li huma differenti mit-tipi ta' dejta tal-kolonni fit-tabella fil-mira. Jekk il-kolonna tat-tabella fil-mira fiha dejta StringType, iżda l-kolonna korrispondenti fid-DataFrame fiha dejta IntegerType, l-infurzar tal-iskema se jarmi eċċezzjoni u jipprevjeni milli sseħħ l-operazzjoni tal-kitba.
- ma jistax ikun fih ismijiet ta' kolonni li jvarjaw biss fil-każ. Dan ifisser li ma jistax ikollok kolonni bl-isem 'Foo' u 'foo' definiti fl-istess tabella. Filwaqt li Spark jista 'jintuża f'modalità sensittiva għall-każi jew insensittiva għall-każi (default), Delta Lake jippreserva l-każi iżda mhuwiex sensittiv fil-ħażna tal-iskema. Parquet huwa sensittiv għall-każi meta jaħżen u jirritorna l-informazzjoni tal-kolonna. Biex nevitaw żbalji possibbli, korruzzjoni tad-dejta, jew telf tad-dejta (xi ħaġa li esperjenzajna personalment f'Databricks), iddeċidejna li nżidu din il-limitazzjoni.
Biex nispjegaw dan, ejja nagħtu ħarsa lejn x'jiġri fil-kodiċi hawn taħt meta nippruvaw inżidu xi kolonni iġġenerati ġodda għal tabella Delta Lake li għadha mhix ikkonfigurata biex taċċettahom.
# Сгенерируем 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.
Minflok awtomatikament iżżid kolonni ġodda, Delta Lake timponi skema u tieqaf tikteb. Biex tgħin tiddetermina liema kolonna (jew sett ta 'kolonni) qed tikkawża d-diskrepanza, Spark joħroġ iż-żewġ skemi mit-traċċa tal-munzell għal tqabbil.
X'inhu l-benefiċċju tal-infurzar ta' schema?
Minħabba li l-infurzar ta 'skema huwa kontroll pjuttost strett, huwa għodda eċċellenti biex tintuża bħala gatekeeper għal sett ta' dejta nadif u kompletament trasformat li huwa lest għall-produzzjoni jew għall-konsum. Tipikament applikat għal tabelli li jalimentaw id-dejta direttament:
- Algoritmi ta' tagħlim bil-magni
- Dashboards tal-BI
- Analitika tad-dejta u għodod ta' viżwalizzazzjoni
- Kwalunkwe sistema ta' produzzjoni li teħtieġ skemi semantiċi strutturati ħafna, ittajpjati b'mod qawwi.
Biex jippreparaw id-dejta tagħhom għal dan l-ostaklu finali, ħafna utenti jużaw arkitettura sempliċi "multi-hop" li gradwalment tintroduċi struttura fit-tabelli tagħhom. Biex titgħallem aktar dwar dan, tista 'tiċċekkja l-artiklu
Naturalment, l-infurzar ta 'skema jista' jintuża kullimkien fil-pipeline tiegħek, imma ftakar li l-istriming għal tabella f'dan il-każ jista 'jkun frustranti għaliex, pereżempju, insejt li żidt kolonna oħra mad-dejta deħlin.
Prevenzjoni tad-dilwizzjoni tad-data
Sa issa inti tista 'tistaqsi, x'inhu l-fuss dwar? Wara kollox, xi drabi żball mhux mistenni ta' "nuqqas ta' qbil ta' skema" jista' jxekkel fil-fluss tax-xogħol tiegħek, speċjalment jekk int ġdid f'Delta Lake. Għaliex ma tħallix l-iskema tinbidel kif meħtieġ sabiex inkun nista' nikteb id-DataFrame tiegħi x'ikun?
Kif jgħid il-qawl il-qadim, “uqija ta’ prevenzjoni tiswa lira ta’ kura.” F'xi punt, jekk ma tieħux ħsieb li tinforza l-iskema tiegħek, kwistjonijiet ta' kompatibilità tat-tip ta' dejta se jqajmu rashom ikrah - sorsi ta' dejta mhux ipproċessati apparentement omoġenji jista' jkun fihom każijiet tat-tarf, kolonni korrotti, mappings iffurmati ħażin, jew affarijiet oħra tal-biża' li joħolmu fihom. inkubi. L-aħjar approċċ huwa li twaqqaf dawn l-għedewwa fil-bieb - bl-infurzar ta 'skema - u jittrattawhom fid-dawl, aktar milli aktar tard meta jibdew lurking fil-fond mudlam tal-kodiċi tal-produzzjoni tiegħek.
L-infurzar ta' skema jagħtik l-assigurazzjoni li l-iskema tat-tabella tiegħek mhix se tinbidel sakemm ma tapprovax il-bidla. Dan jipprevjeni d-dilwizzjoni tad-data, li tista 'sseħħ meta kolonni ġodda huma miżjuda tant ta' spiss li tabelli preċedentement ta 'valur u kkompressati jitilfu t-tifsira u l-utilità tagħhom minħabba l-għargħar tad-data. Billi jħeġġiġek tkun intenzjonat, tistabbilixxi standards għoljin, u tistenna kwalità għolja, l-infurzar tal-skema jagħmel eżattament dak li kien iddisinjat biex jagħmel—jgħinek tibqa’ kuxjenzjuż u l-ispreadsheets tiegħek nodfa.
Jekk wara konsiderazzjoni ulterjuri inti tiddeċiedi li int verament li żid kolonna ġdida - l-ebda problema, hawn taħt hemm tiffissa b'linja waħda. Is-soluzzjoni hija l-evoluzzjoni taċ-ċirkwit!
X'inhi l-evoluzzjoni tal-iskema?
L-evoluzzjoni tal-iskema hija karatteristika li tippermetti lill-utenti jibdlu faċilment l-iskema tal-mejda attwali skont id-dejta li tinbidel maż-żmien. Huwa l-aktar spiss użat meta twettaq operazzjoni ta 'append jew kitba mill-ġdid biex tadatta awtomatikament l-iskema biex tinkludi kolonna waħda jew aktar ġodda.
Kif taħdem l-evoluzzjoni tal-iskema?
Wara l-eżempju mit-taqsima preċedenti, l-iżviluppaturi jistgħu faċilment jużaw l-evoluzzjoni tal-iskema biex iżidu kolonni ġodda li qabel kienu miċħuda minħabba inkonsistenza tal-iskema. L-evoluzzjoni taċ-ċirkwit tiġi attivata billi żżid .option('mergeSchema', 'true')
lit-tim Spark tiegħek .write или .writeStream.
# Добавьте параметр mergeSchema
loans.write.format("delta")
.option("mergeSchema", "true")
.mode("append")
.save(DELTALAKE_SILVER_PATH)
Biex tara l-graff, mexxi l-mistoqsija Spark SQL li ġejja
# Создайте график с новым столбцом, чтобы подтвердить, что запись прошла успешно
%sql
SELECT addr_state, sum(`amount`) AS amount
FROM loan_by_state_delta
GROUP BY addr_state
ORDER BY sum(`amount`)
DESC LIMIT 10
Inkella, tista 'tissettja din l-għażla għas-sessjoni Spark kollha billi żżid spark.databricks.delta.schema.autoMerge = True
għall-konfigurazzjoni Spark. Imma uża dan b'kawtela, peress li l-infurzar ta' l-iskema ma jibqax javżak għal inkonsistenzi ta' schema mhux intenzjonati.
Billi tinkludi l-parametru fit-talba mergeSchema
, il-kolonni kollha li huma preżenti fid-DataFrame iżda mhux fit-tabella fil-mira huma miżjuda awtomatikament fl-aħħar tal-iskema bħala parti minn transazzjoni ta' kitba. Jistgħu jiġu miżjuda wkoll oqsma mdaħħla u dawn se jiżdiedu wkoll fit-tarf tal-kolonni tal-istruttura korrispondenti.
L-inġiniera tad-dejta u x-xjenzati tad-dejta jistgħu jużaw din l-għażla biex iżidu kolonni ġodda (forsi metrika reċentement rintraċċata jew kolonna tal-prestazzjoni tal-bejgħ ta 'dan ix-xahar) mat-tabelli eżistenti tal-produzzjoni tat-tagħlim tal-magni tagħhom mingħajr ma jiksru mudelli eżistenti bbażati fuq kolonni qodma.
It-tipi li ġejjin ta’ bidliet fl-iskema huma permessi bħala parti mill-evoluzzjoni tal-iskema waqt żieda jew kitba mill-ġdid ta’ tabella:
- Żieda ta' kolonni ġodda (dan huwa l-aktar xenarju komuni)
- Nibdlu t-tipi tad-dejta minn NullType -> kwalunkwe tip ieħor jew promozzjoni minn ByteType -> ShortType -> IntegerType
Bidliet oħra mhux permessi fi ħdan l-evoluzzjoni tal-iskema jeħtieġu li l-iskema u d-dejta jinkitbu mill-ġdid billi jiżdiedu .option("overwriteSchema", "true")
. Pereżempju, fil-każ fejn il-kolonna "Foo" kienet oriġinarjament numru sħiħ u l-iskema l-ġdida kienet tip ta 'data ta' string, allura l-fajls kollha tal-Parquet(data) ikun jeħtieġ li jinkitbu mill-ġdid. Bidliet bħal dawn jinkludu:
- tħassar kolonna
- it-tibdil tat-tip ta' dejta ta' kolonna eżistenti (fil-post)
- tibdil tal-isem ta' kolonni li jvarjaw biss fil-każ (per eżempju, "Foo" u "foo")
Fl-aħħarnett, bir-rilaxx li jmiss ta 'Spark 3.0, DDL espliċitu se jkun appoġġjat bis-sħiħ (bl-użu ALTER TABLE), li jippermetti lill-utenti jwettqu l-azzjonijiet li ġejjin fuq skemi ta' tabella:
- iżżid kolonni
- kummenti fil-kolonna li jinbidlu
- l-issettjar tal-proprjetajiet tal-mejda li jikkontrollaw l-imġieba tat-tabella, bħall-issettjar tat-tul ta 'żmien li reġistru tat-tranżazzjonijiet huwa maħżun.
X'inhu l-benefiċċju tal-evoluzzjoni taċ-ċirkwit?
Evoluzzjoni ta 'skema tista' tintuża kull meta inti intenzjoni ibdel l-iskema tat-tabella tiegħek (kuntrarju għal meta aċċidentalment żidt kolonni mad-DataFrame tiegħek li m'għandhomx ikunu hemm). Dan huwa l-eħfef mod biex temigra l-iskema tiegħek għaliex awtomatikament iżid l-ismijiet tal-kolonni korretti u t-tipi tad-dejta mingħajr ma jkollok għalfejn tiddikjarahom b’mod espliċitu.
Konklużjoni
L-infurzar tal-iskema jirrifjuta kwalunkwe kolonni ġodda jew bidliet oħra fl-iskema li mhumiex kompatibbli mat-tabella tiegħek. Billi jistabbilixxu u jżommu dawn l-istandards għoljin, l-analisti u l-inġiniera jistgħu jafdaw li d-dejta tagħhom għandha l-ogħla livell ta 'integrità, u jikkomunikawha b'mod ċar u ċar, li jippermettilhom jieħdu deċiżjonijiet kummerċjali aħjar.
Min-naħa l-oħra, l-evoluzzjoni tal-iskema tikkumplimenta l-infurzar billi tissimplifika allegat bidliet awtomatiċi fl-iskema. Wara kollox, m'għandux ikun diffiċli li żżid kolonna.
L-applikazzjoni sfurzata tal-iskema hija yang, fejn l-evoluzzjoni tal-iskema hija yin. Meta jintużaw flimkien, dawn il-karatteristiċi jagħmlu s-soppressjoni tal-istorbju u l-irfinar tas-sinjali aktar faċli minn qatt qabel.
Nixtiequ wkoll nirringrazzjaw lil Mukul Murthy u Pranav Anand għall-kontributi tagħhom għal dan l-artikolu.
Artikli oħra f'din is-serje:
Artikoli Relatati
Sors: www.habr.com