Hey Habr! Wergera gotarê pêşkêşî we dikim nivîskar Burak Yavuz, Brenner Heintz û Denny Lee ku li hêviya destpêkirina qursê hatibû amadekirin. ji OTUS.

Daneyên, mîna ezmûna me, bi domdarî kom dibin û pêşve diçin. Ji bo ku em bidomînin, divê modelên me yên derûnî yên cîhanê li gorî daneyên nû biguncînin, ku hin ji wan pîvanên nû vedigirin - awayên nû yên çavdêriya tiştên ku me berê qet haya me jê tunebû. Van modelên derûnî ji şemayên tabloyê pir cûda ne ku diyar dikin ka em çawa agahdariya nû kategorîze dikin û pêvajoyê dikin.
Ev me tîne ser mijara rêveberiya schema. Her ku dijwarî û hewcedariyên karsaziyê bi demê re diguhezin, wusa jî strukturên daneyên we jî diguhere. Delta Lake danasîna pîvandinên nû wekî guhertinên daneyê hêsan dike. Bikarhêner gihîştina semantîkên hêsan hene ku nexşeyên tabloya xwe birêve bibin. Van amûran di nav de Schema Enforcement, ku bikarhêneran ji pîskirina tabloyên xwe bi xeletî an daneyên nepêwist diparêze, û Schema Evolution, ku dihêle stûnên nû yên daneyên hêja bixweber li cîhên guncan werin zêdekirin. Di vê gotarê de, em ê di karanîna van amûran de kûrtir bisekinin.
Fêmkirina Schemas Table
Her DataFrame di Apache Spark de şemayek heye ku forma daneyê, wekî celebên daneyê, stûn û metadata diyar dike. Bi Gola Delta re, şema sifrê di forma JSON de di hundurê têketina danûstendinê de tê hilanîn.
Pêkanîna planê çi ye?
Enforcement Schema, ku wekî Schema Validation jî tê zanîn, li Gola Deltayê mekanîzmayek ewlehiyê ye ku bi redkirina tomarên ku bi şemaya tabloyê re hev nagirin qalîteya daneyê misoger dike. Mîna mêhvana li pêş maseya xwaringehek bi tenê veqetandinê ya populer, ew kontrol dike ka her stûna daneya ku ketiye tabloyê di navnîşa têkildar a stûnên bendewar de ye (bi gotinek din, gelo ji bo her yek ji wan "veqetandin" heye ), û her tomarên bi stûnên ku di navnîşê de ne red dike.
Pêkanîna schema çawa dixebite?
Delta Lake kontrolkirina şema-li-nivîsandinê bikar tîne, ku tê vê wateyê ku hemî nivîsên nû yên li ser sifrê ji bo lihevhatina bi şemaya tabloya armancê di dema nivîsandinê de têne kontrol kirin. Ger şema nakok be, Delta Lake danûstendinê bi tevahî betal dike (danûstandin nayê nivîsandin) û îstîsnayek radike da ku bikarhêner ji nerazîbûnê agahdar bike.
Delta Lake qaîdeyên jêrîn bikar tîne da ku diyar bike ka tomarek bi tabloyê re hevaheng e. DataFrame ya Nivîsbar:
- nikare stûnên din ên ku di şemaya tabloya armancê de ne bihewîne. Berevajî vê, her tişt baş e ger daneyên gihîştî bi tevahî stûnên ji tabloyê negirin - dê van stûnan bi tenê nirxên betal werin veqetandin.
- nikare cureyên daneya stûnê yên ku ji celebên daneya stûnên di tabloya armancê de cûda ne hebin. Ger stûna tabloya armanc daneya StringType dihewîne, lê stûna têkildar a di DataFrame de daneyên IntegerType dihewîne, bicîhkirina şemayê dê îstîsnayekê bavêje û rê li ber pêkanîna operasyona nivîsandinê bigire.
- nikare navên stûnên ku tenê di dozê de ji hev cûda dibin hebin. Ev tê wê wateyê ku hûn nikarin stûnên bi navên 'Foo' û 'foo' di heman tabloyê de werin diyarkirin. Digel ku Spark dikare di moda hesas-hesas an jî-nehessas (default) de were bikar anîn, Delta Lake-parastina dozê ye lê di nav hilanîna schema de nehesas e. Di dema hilanîn û vegerandina agahdariya stûnê de parket hesas e. Ji bo ku em ji xeletiyên mumkun, xirabûna daneyê, an windabûna daneyê dûr nekevin (tiştek ku me bi xwe li Databricks ceriband), me biryar da ku em vê sînordariyê zêde bikin.
Ji bo ronîkirina vê yekê, ka em mêze bikin ka di koda jêrîn de çi diqewime dema ku em hewl didin ku hin stûnên nû hatine hilberandin li tabloyek Gola Delta ya ku hîn nehatiye mîheng kirin ku wan qebûl bike zêde bikin.
# Сгенерируем 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.Li şûna ku bixweber stûnên nû lê zêde bike, Delta Lake şemayek ferz dike û nivîsandinê rawestîne. Ji bo ku were destnîşankirin ka kîjan stûn (an komek stûnan) dibe sedema nakokiyê, Spark ji bo berhevdanê her du şemayan ji şopa stûnê derdixe.
Feydeya sepandina şemayekê çi ye?
Ji ber ku bicîhkirina schema kontrolek pir hişk e, ew amûrek hêja ye ku meriv wekî dergehvanek daneya paqij, bi tevahî veguhartî ku ji bo hilberandin an vexwarinê amade ye bikar bîne. Bi gelemperî li ser tabloyên ku rasterast daneyê tê sepandin:
- Algorîtmayên fêrbûna makîneyê
- BI dashboards
- Amûrên analîtîk û dîtinê yên daneyê
- Her pergalek hilberînê ya ku pêdivî bi şemayên semantîk ên pir birêkûpêk, bi hêzdarkirî heye.
Ji bo amadekirina daneyên xwe ji bo vê astengiya paşîn, gelek bikarhêner mîmariyek "pir-hop" a hêsan bikar tînin ku hêdî hêdî strukturê di tabloyên xwe de vedihewîne. Ji bo bêtir agahdarî li ser vê yekê, hûn dikarin gotarê binihêrin
Bê guman, bicîhkirina şêmayê dikare li her deverê di lûleya we de were bikar anîn, lê ji bîr mekin ku di vê rewşê de weşîna li ser masê dikare xemgîn be ji ber ku, mînakî, we ji bîr kir ku we stûnek din li daneya gihîştî zêde kiriye.
Pêşîlêgirtina kêmbûna daneyan
Heya nuha hûn dikarin bipirsin, gelo hemî kêşe li ser çi ye? Beriya her tiştî, carinan xeletiyek neçaverêkirî ya "nehevhatina schema" dikare we di xebata we de bişewitîne, nemaze heke hûn nû li Delta Lake ne. Ma çima nehêle ku şema wekî ku hewce be biguhezîne da ku ez dikarim DataFrame-ya xwe binivîsim çi dibe bila bibe?
Wekî ku gotina kevn dibêje, "onsek pêşîlêgirtinê hêjayî lîreyek dermankirinê ye." Di hin xalan de, heke hûn guh nedin tetbîqkirina şemaya xwe, pirsgirêkên lihevhatina celebê daneyê dê serê xwe yê gemar hilde - çavkaniyên daneya xav ên homojen ên xuyayî dibe ku dozên qerax, stûnên xerabûyî, nexşeyên xelet, an tiştên din ên tirsnak ên ku meriv di xewnan de dihewîne hebin. kabûs. Nêzîkatiya çêtirîn ev e ku meriv van dijminan li ber derî rawestîne - bi sepandina şemayê - û di ronahiyê de bi wan re mijûl bibe, ne ku paşê gava ku ew di kûrahiya tarî ya koda hilberîna we de dest pê bikin.
Bicîhkirina şemayek piştrastiyê dide we ku heya ku hûn guheztinê nepejirînin şemaya tabloya we nayê guhertin. Ev rê li ber kêmbûna daneyan digire, ya ku dikare çêbibe dema ku stûnên nû ew qas pir caran têne zêdekirin ku tabloyên berê yên binirx, yên pêçandî ji ber barkirina daneyan wate û kêrhatiya xwe winda dikin. Bi teşwîqkirina we ku hûn bi mebest bin, standardên bilind saz bikin, û li hêviya kalîteya bilind bin, bicîhkirina şemayê tam tiştê ku ji bo kirina wê hatî sêwirandin dike - ji we re dibe alîkar ku hûn bi wijdan bimînin û pelên berbelav ên xwe paqij bikin.
Ger li ser nirxandinek din hûn biryar bidin ku hûn bi rastî hewce ne stûnek nû lê zêde bike - pirsgirêk nîne, li jêr sererastkirinek yek-xêzek heye. Çareserî peşveçûna çerxê ye!
Pêşveçûna schema çi ye?
Pêşveçûna Schema taybetmendiyek e ku destûrê dide bikarhêneran ku bi hêsanî şemaya tabloya heyî li gorî daneyên ku bi demê re diguhezin biguhezînin. Ew pirî caran dema ku operasyonek pêvek an ji nû ve nivîsandinê tê bikar anîn da ku bixweber şema biguhezîne da ku yek an çend stûnên nû vehewîne.
Pêşveçûna schema çawa dixebite?
Li dû mînaka ji beşa berê, pêşdebir dikarin bi hêsanî pêşkeftina schema bikar bînin da ku stûnên nû yên ku berê ji ber nerazîbûna schema hatine red kirin zêde bikin. Pêşveçûna dorpêçê bi lêzêdekirinê tê çalak kirin .option('mergeSchema', 'true') ji tîma xwe ya Spark re .write или .writeStream.
# Добавьте параметр mergeSchema
loans.write.format("delta")
.option("mergeSchema", "true")
.mode("append")
.save(DELTALAKE_SILVER_PATH)Ji bo dîtina grafîkê, pirsa Spark SQL ya jêrîn bimeşînin
# Создайте график с новым столбцом, чтобы подтвердить, что запись прошла успешно
%sql
SELECT addr_state, sum(`amount`) AS amount
FROM loan_by_state_delta
GROUP BY addr_state
ORDER BY sum(`amount`)
DESC LIMIT 10 
Alternatîf, hûn dikarin vê vebijarkê ji bo tevaya danişîna Spark bi lêzêdekirinê saz bikin spark.databricks.delta.schema.autoMerge = True ji bo veavakirina Spark. Lê vê yekê bi hişyariyê bikar bînin, ji ber ku bicîhkirina şemayê dê êdî we ji nakokiyên nexşeyê yên bêaqil hişyar neke.
Bi tevlêkirina parametreyê di daxwaziyê de mergeSchema, hemî stûnên ku di DataFrame de hene lê ne di tabloya armancê de ne, bixweber wekî beşek ji danûstendinek nivîsandinê li dawiya şemayê têne zêdekirin. Zeviyên hêlînkirî jî dikarin werin zêdekirin û ev jî dê li dawiya stûnên strukturên têkildar werin zêdekirin.
Endezyarên tarîxê û zanyarên daneyê dikarin vê vebijarkê bikar bînin da ku stûnên nû (dibe ku metrîka nû hatî şopandin an stûna performansa firotanê ya vê mehê) li tabloyên hilberîna fêrbûna makîneya heyî zêde bikin bêyî ku modelên heyî yên li ser bingeha stûnên kevn bişkînin.
Cûreyên jêrîn ên guherînên şemayê wekî beşek ji pêşkeftina şemayê di dema zêdekirin an ji nû ve nivîsandina tabloyê de têne destûr kirin:
- Zêdekirina stûnên nû (ev senaryoya herî gelemperî ye)
- Guhertina celebên daneyê ji NullType -> her cûreyek din an jî ji ByteType pêşvebirin -> ShortType -> IntegerType
Guhertinên din ên ku di nav pêşkeftina schema de destûr nayê dayîn hewce dike ku şema û dane bi lêzêdekirinê ji nû ve werin nivîsandin .option("overwriteSchema", "true"). Mînakî, di rewşa ku stûna "Foo" di eslê xwe de jimareyek tevde bû û şema nû celebek daneya rêzê bû, wê hingê pêdivî ye ku hemî pelên Parquet (dane) ji nû ve werin nivîsandin. Guhertinên weha hene:
- jêbirina stûnek
- Guhertina celebê daneya stûnek heyî (di cîh de)
- guherandina navên stûnên ku tenê di rewşê de cûda dibin (mînak, "Foo" û "foo")
Di dawiyê de, bi serbestberdana paşîn a Spark 3.0 re, DDL-ya eşkere dê bi tevahî were piştgirî kirin (ALTER TABLE bikar tîne), ku dihêle bikarhêner li ser şemayên tabloyê çalakiyên jêrîn pêk bînin:
- zêdekirina stûnan
- guhertina şîroveyên stûnê
- danîna taybetmendiyên tabloyê yên ku tevgera tabloyê kontrol dikin, wek mînak danîna dirêjahiya dema tomarkirina têketinek danûstendinê.
Feydeya pêşkeftina çerxê çi ye?
Pêşveçûna Schema dikare gava ku hûn bikar bînin bikar bînin nêtkirin şemaya tabloya xwe biguhezînin (berevajî dema ku we bi xeletî stûn li DataFrame-ya xwe zêde kir ku divê ne li wir be). Ev awayê herî hêsan e ku hûn şemaya xwe biguhezînin ji ber ku ew bixweber navên stûnên rast û celebên daneyê lê zêde dike bêyî ku wan bi eşkere eşkere bike.
encamê
Bicîhkirina Schema her stûnên nû an guhertinên din ên şema ku bi tabloya we re ne hevaheng in red dike. Bi danîn û domandina van standardên bilind, analîst û endezyar dikarin pê bawer bin ku daneyên wan xwedan asta herî bilind a yekitiyê ye, wê bi zelal û zelal ragihînin, rê dide wan ku biryarên karsaziya çêtir bidin.
Ji hêla din ve, pêşveçûna schema bi hêsankirina bicîhkirinê temam dike îdia kirin Guherandinên şema otomatîk. Beriya her tiştî, lê zêdekirina stûnek ne dijwar be.
Sepana bi zorê ya planê yang e, li ku derê pêşkeftina planê yin e. Dema ku bi hev re têne bikar anîn, ev taybetmendî tepeserkirina deng û ahenga nîşanê ji her demê hêsantir dike.
Em jî ji bo beşdariya wan di vê gotarê de spasiya Mukul Murthy û Pranav Anand dikin.
Gotarên din ên vê rêzê:

Gotarên Têkildar
Source: www.habr.com
