Midira ao amin'ny Farihy Delta: Fampiharana sy Evolisiona Schema

Hey Habr! Atolotro ho anareo ny fandikana ilay lahatsoratra "Mitsirika ao amin'ny Farihy Delta: Fampiharana sy Evolisiona" mpanoratra Burak Yavuz, Brenner Heintz ary Denny Lee, izay nomanina ho fiandrasana ny fanombohan'ny fampianarana. Data Engineer avy amin'ny OTUS.

Midira ao amin'ny Farihy Delta: Fampiharana sy Evolisiona Schema

Ny angona, toy ny traikefantsika, dia miangona sy mivoatra hatrany. Mba hanaraha-maso, ny maodely ara-tsaina eto amin'izao tontolo izao dia tsy maintsy mampifanaraka amin'ny angon-drakitra vaovao, ny sasany amin'izy ireo dia misy refy vaovao β€” fomba vaovao hijerena zavatra tsy noeritreretinay taloha. Ireo maodely ara-tsaina ireo dia tsy mitovy amin'ny schemas latabatra izay mamaritra ny fomba fanasokajiana sy fikarakarana vaovao.

Izany dia mitondra antsika amin'ny resaka fitantanana schema. Rehefa miova ny tanjona sy ny fepetra takian'ny fandraharahana rehefa mandeha ny fotoana, dia miova koa ny firafitry ny angonao. Ny Farihy Delta dia manamora ny fametrahana fandrefesana vaovao rehefa miova ny angona. Ny mpampiasa dia afaka miditra amin'ny semantika tsotra hitantana ny schema latabatra. Anisan'ireo fitaovana ireo ny Schema Enforcement, izay miaro ny mpampiasa tsy handoto tsy nahy ny latabatra misy azy amin'ny hadisoana na angona tsy ilaina, ary ny Schema Evolution, izay mamela ireo tsanganana vaovao misy angon-drakitra sarobidy mba hampidirina ho azy amin'ny toerana mety. Ato amin'ity lahatsoratra ity dia hiresaka momba ny fampiasana ireo fitaovana ireo isika.

Fahatakarana ny schemas table

Ny DataFrame tsirairay ao amin'ny Apache Spark dia misy schema izay mamaritra ny endrik'ireo angona toy ny karazana data, tsanganana, ary metadata. Miaraka amin'ny Farihy Delta, voatahiry amin'ny endrika JSON ao anatin'ny diarin'ny fifanakalozana ny skema latabatra.

Inona no atao hoe Schema Enforcement?

Schema Enforcement, fantatra ihany koa amin'ny hoe Schema Validation, dia rafitra fiarovana ao amin'ny Farihy Delta izay miantoka ny kalitaon'ny angona amin'ny alalan'ny fandavana ireo firaketana tsy mifanaraka amin'ny tetika latabatra. Tahaka ny mpampiantrano vahiny iray eo amin'ny latabatry ny trano fisakafoanana malaza iray izay manaiky famandrihana ihany, dia mijery raha toa ka ao anatin'ny lisitry ny tsanganana andrasana ny tsanganana tsirairay misy angon-drakitra tafiditra ao anaty latabatra (amin'ny teny hafa, raha misy "famandrihana" ho an'ny tsirairay amin'izy ireo), ary mandΓ  ny fidirana misy tsanganana tsy ao anaty lisitra.

Ahoana no fiasan'ny fampiharana ny schema?

Ny Farihy Delta dia mampiasa ny fanamarinana schema amin'ny fanoratana, izay midika fa ny fanoratana vaovao rehetra amin'ny latabatra dia voamarina raha mifanaraka amin'ny schema an'ny latabatra kendrena amin'ny fotoana fanoratana. Raha tsy mifanaraka ny tetika, dia mamadika tanteraka ny fifampiraharahana ny Delta Lake (tsy misy angon-drakitra voasoratra) ary manipy fanavahana mba hampahafantarana ny mpampiasa ny tsy fitovian-kevitra.
Mampiasa ireto fitsipika manaraka ireto ny Farihy Delta mba hamaritana raha mifanaraka amin'ny latabatra ny rakitra iray. DataFrame voasoratra:

  • tsy afaka ahitana tsanganana fanampiny izay tsy ao amin'ny skema an'ny latabatra kendrena. Mifanohitra amin'izany, tsara ny zava-drehetra raha tsy ahitana ny tsanganana rehetra avy amin'ny latabatra ny angon-drakitra miditra - ireo tsanganana ireo dia homena sanda zero fotsiny.
  • tsy afaka manana karazana angona tsanganana tsy mitovy amin'ny karazana angona tsanganana ao amin'ny latabatra kendrena. Raha misy tsanganana ao amin'ny latabatra kendrena misy angona StringType, fa ny tsanganana mifanaraka amin'izany ao amin'ny DataFrame dia misy angona IntegerType, ny fampiharana ny schema dia hanisy fanavahana ary hanakana ny asa fanoratana tsy hitranga.
  • tsy misy anarana tsanganana izay tsy mitovy afa-tsy amin'ny tranga. Midika izany fa tsy afaka manana tsanganana antsoina hoe 'Foo' sy 'foo' voafaritry ny tabilao iray ianao. Raha ny Spark dia azo ampiasaina amin'ny cas-sensitive na case-insensitive (ny default), ny Delta Lake dia mitahiry tranga fa tsy misy dikany ao anatin'ny fitahirizana schema. Ny parquet dia saro-pady rehefa mitahiry sy mamerina ny mombamomba ny tsanganana. Mba hisorohana ny mety ho lesoka, ny kolikoly angon-drakitra na ny fahaverezan'ny angon-drakitra (izay niainanay manokana tao amin'ny Databricks), dia nanapa-kevitra ny hampiditra io fetra io izahay.

Mba hanazavana an'izany, andeha hojerentsika ny zava-mitranga ao amin'ny kaody etsy ambany rehefa manandrana manampy tsanganana vao noforonina amin'ny latabatra Delta Lake izay tsy mbola namboarina hanaiky azy ireo.

# Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ 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.

Raha tokony hampiditra tsanganana vaovao ho azy, ny Delta Lake dia mampihatra tetika ary mampiato ny firaketana. Mba hamaritana hoe iza amin'ireo tsanganana (na andian'izy ireo) no mahatonga ny tsy fitovian-kevitra, dia avoakan'i Spark avy ao amin'ny antontan-taratasin'ny trace izy roa ireo ho fampitahana.

Inona no tombony amin'ny fampiharana ny schema?

Koa satria fanaraha-maso henjana ny fampiharana ny schema, dia fitaovana tsara ampiasaina ho mpiandry vavahadin'ny angon-drakitra madio sy miova tanteraka izay vonona ny hamokatra na hohanina. Ampiasaina matetika amin'ny tabilao mamahana angona mivantana:

  • Algorithm fianarana milina
  • Vidin'ny BI
  • Fanadihadiana data sy fitaovana fijerena sary
  • Izay rafitra famokarana mila rafitra semantika tena voalamina tsara.

Mba hanomanana ny angonany amin'ity sakana farany ity, mpampiasa maro no mampiasa rafitra "multi-hop" tsotra izay mampiditra tsikelikely ny rafitra ao amin'ny latabany. Raha te hahalala bebe kokoa momba izany ianao dia afaka mamaky ny lahatsoratra Ny fianarana milina famokarana miaraka amin'ny Delta Lake.

Mazava ho azy fa azo ampiasaina na aiza na aiza ao amin'ny fantsonao ny fampiharana ny schema, saingy tadidio fa mety hahakivy ny fandefasana ny fanoratana amin'ny latabatra amin'ity tranga ity, satria, ohatra, adinonao fa nanampy tsanganana hafa tamin'ny angona ho avy ianao.

Fisorohana ny fanivanana data

Amin'izao fotoana izao, mety hanontany tena ianao hoe nahoana ny hype? Rehefa dinihina tokoa, indraindray ny hadisoana "skema mismatch" tsy nampoizina dia mety hampiakatra anao amin'ny fizotranao, indrindra raha vaovao amin'ny Delta Lake ianao. Maninona raha avela hiova araka izay ilainy fotsiny ny tetika mba hahafahako manoratra ny DataFrame-ko na inona na inona?

Araka ny voalazan'ny ohabolana taloha hoe: "Ny onjam-piarovana iray dia mendrika ny fitsaboana iray kilao." Amin'ny fotoana iray, raha tsy mitandrina amin'ny fampiharana ny teti-dratsy ianao, dia mety hiteraka olana amin'ny fampifanarahana karazana data - ny loharanon-kevitra manta mitovitovy dia mety ahitana tranga sisiny, tsanganana tapaka, sarintany diso, na zavatra mampatahotra hafa izay nofinofinao. .amin'ny nofy ratsy. Ny fomba tsara indrindra dia ny manakana ireo fahavalo ireo eo am-bavahady - miaraka amin'ny fampiharana ny schema - ary miatrika azy ireo amin'ny hazavana, fa tsy any aoriana rehefa manomboka mamakivaky ny halalin'ny kaody famokaranao izy ireo.

Ny fampiharana ny skΓ©ma dia manome anao fahatokiana fa tsy hiova ny tetika an-databatrao raha tsy ianao no manamafy ny fanovana. Izany dia manakana ny fandotoana angon-drakitra izay mety hitranga rehefa ampiana tsanganana vaovao matetika ka very ny lanjany sy ny maha-ilaina azy ireo tabilao voaporitra teo aloha noho ny tondra-drano. Amin'ny famporisihana anao hanao fanahy iniana, hametraka fenitra avo lenta, ary hanantena kalitao avo lenta, ny fampiharana ny tetika dia manao araka izay nokasainy hatao β€” manampy anao hitandrina tsara sy hitazona ny takelakao ho madio.

Raha, rehefa mandinika bebe kokoa, dia manapa-kevitra fa tena ianao mila ampio tsanganana vaovao - tsy misy olana, eto ambany ny fanamboarana andalana iray. Ny vahaolana dia ny fivoaran'ny circuit!

Inona no atao hoe evolisiona schema?

Ny evolisiona skema dia endri-javatra ahafahan'ny mpampiasa manova mora foana ny skema ankehitriny amin'ny latabatra iray mba hifanaraka amin'ny angona miova rehefa mandeha ny fotoana. Matetika izy io no ampiasaina rehefa manao asa fanampiny na overwrite mba hampifanaraka ho azy ny tetika mba hampidirana tsanganana vaovao iray na maromaro.

Ahoana no fiasan'ny evolisiona schema?

Manaraka ny ohatra ao amin'ny fizarana teo aloha, ny mpamorona dia afaka mampiasa mora foana ny fivoaran'ny skema mba hanampiana tsanganana vaovao izay nolavina teo aloha noho ny tsy fitovian'ny tetika. Ny fivoaran'ny circuit dia alefa amin'ny fanampiana .option('mergeSchema', 'true') amin'ny ekipanao Spark .write ΠΈΠ»ΠΈ .writeStream.

# Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ mergeSchema
loans.write.format("delta") 
           .option("mergeSchema", "true") 
           .mode("append") 
           .save(DELTALAKE_SILVER_PATH)

Raha te hijery ny grafika dia araho ity fanontaniana Spark SQL manaraka ity

# Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊ с Π½ΠΎΠ²Ρ‹ΠΌ столбцом, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ запись ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ
%sql
SELECT addr_state, sum(`amount`) AS amount
FROM loan_by_state_delta
GROUP BY addr_state
ORDER BY sum(`amount`)
DESC LIMIT 10

Midira ao amin'ny Farihy Delta: Fampiharana sy Evolisiona Schema
Raha tsy izany, azonao atao ny mametraka ity safidy ity ho an'ny session Spark manontolo amin'ny alΓ lan'ny fanampiana spark.databricks.delta.schema.autoMerge = True mankany amin'ny configuration Spark. Ampiasao amim-pitandremana anefa izany, satria tsy hampitandrina anao intsony momba ny tsy fitovian'ny tetika tsy nahy ny fampiharana ny tetika.

Amin'ny fampidirana paramètre amin'ny fangatahana mergeSchema, ny tsanganana rehetra izay hita ao amin'ny DataFrame fa tsy ao amin'ny latabatra kendrena dia ampidirina ho azy amin'ny faran'ny skema ho ampahany amin'ny fifampiraharahana fanoratana. Azo ampiana ihany koa ny saha misy akany, ary ampiana amin'ny faran'ny tsanganana rafitra mifanaraka amin'izany koa ireo.

Afaka mampiasa ity safidy ity ny injenieran'ny daty sy ny mpahay siansa momba ny angona mba hanampiana tsanganana vaovao (angamba metrika narahina vao haingana na tsanganana taham-pivarotana amin'ity volana ity) amin'ny latabatra famokarana fianarana milina efa misy nefa tsy manapaka ny maodely efa misy miorina amin'ny tsanganana taloha.

Ireto karazana fanovana kitika manaraka ireto dia avela ho ampahany amin'ny fivoaran'ny skema rehefa manampy na manodina latabatra:

  • Manampy tsanganana vaovao (io no tranga mahazatra indrindra)
  • Manova karazana data avy amin'ny NullType -> karazana na fampiroboroboana hafa avy amin'ny ByteType -> ShortType -> IntegerType

Ny fanovana hafa izay tsy avela ho ampahany amin'ny fivoaran'ny skema dia mitaky ny hanoratana ny skema sy ny angona amin'ny fanampiana .option("overwriteSchema", "true"). Ohatra, raha ny tsanganana "Foo" dia integer tany am-boalohany ary ny schema vaovao dia karazana angona tady, dia mila hosoloina ny rakitra Parquet(data) rehetra. Ireto fanovana ireto dia ahitana:

  • famafana tsanganana
  • manova ny karazana angona amin'ny tsanganana efa misy (eo amin'ny toerany)
  • fanovana anarana tsanganana izay tsy mitovy afa-tsy amin'ny tranga (ohatra, "Foo" sy "foo")

Farany, miaraka amin'ny famoahana Spark 3.0 manaraka, ny DDL mazava (mampiasa ALTER TABLE) dia ho tohanana tanteraka, ahafahan'ny mpampiasa manao ireto hetsika manaraka ireto amin'ny skema latabatra:

  • manampy tsanganana
  • fanovana fanehoan-kevitra tsanganana
  • mametraka ny toetran'ny latabatra izay mamaritra ny fihetsiky ny latabatra, toy ny fametrahana ny halavan'ny fitehirizana ny diarin'ny varotra.

Inona no tombony amin'ny fivoaran'ny schema?

Ny evolisiona schematic dia azo ampiasaina amin'ny fotoana rehetra mikasa ovay ny schema amin'ny latabatrao (mifanohitra amin'ny hoe nampiditra tsanganana tsy nahy tao amin'ny DataFrame izay tsy tokony ho eo). Ity no fomba mora indrindra hamindra ny skema-nao satria ampidiriny ho azy ireo anarana tsanganana sy karazana angona marina nefa tsy mila manambara azy ireo mazava.

famaranana

MandΓ  tsanganana vaovao na fanovana kitika hafa tsy mifanaraka amin'ny latabatrao ny fampiharana ny tetika. Amin'ny fametrahana sy fitazonana ireo fenitra avo ireo, ny mpandinika sy ny injeniera dia afaka miantehitra amin'ny angon-dry zareo mba hananana ambaratonga ambony indrindra amin'ny fahamendrehana, manjohy hevitra momba izany mazava sy mazava, mamela azy ireo handray fanapahan-kevitra tsara kokoa momba ny raharaham-barotra.

Amin'ny lafiny iray, ny fivoaran'ny schema dia mameno ny fampiharana amin'ny fanatsorana lazaina fanovana tetika mandeha ho azy. Rehefa dinihina tokoa, dia tsy tokony ho sarotra ny manampy tsanganana.

Ny fampiharana ny tetika dia yang, izay misy ny fivoaran'ny tetika dia yin. Rehefa ampiasaina miaraka, ireo endri-javatra ireo dia manamora kokoa ny fampihenana ny tabataba sy ny fanamafisam-peo.

Misaotra an'i Mukul Murthy sy Pranav Anand koa izahay tamin'ny fandraisany anjara tamin'ity lahatsoratra ity.

Lahatsoratra hafa amin'ity andiany ity:

Midira ao amin'ny Farihy Delta: esory ny diarin'ny varotra

Lahatsoratra mifandraika

Ny fianarana milina famokarana miaraka amin'ny Delta Lake

Inona no atao hoe farihy data?

Mianara bebe kokoa momba ny fianarana

Source: www.habr.com

Add a comment