U quuso harada Delta: Hirgelinta Qorshaha iyo Kobcinta

Hello, Habr! Waxaan dareenkaaga ku soo bandhigayaa tarjumaad maqaalka "Ku quusidda harada Delta: Hirgelinta Qorshaha & Kobcinta" Qorayaasha Burak Yavuz, Brenner Heintz iyo Denny Lee, kuwaas oo la diyaariyay iyadoo la filayo bilowga koorsada Injineerka Xogta ka OTUS.

U quuso harada Delta: Hirgelinta Qorshaha iyo Kobcinta

Xogta, sida waayo-aragnimadeena, ayaa si joogto ah u urursan oo u kobcaysa. Si aan u sii wadno, moodooyinka maskaxeed ee adduunku waa in ay la qabsadaan xogta cusub, kuwaas oo qaar ka mid ah ay ka kooban yihiin cabbiro cusub - siyaabo cusub oo loo ilaaliyo waxyaabo aynaan hore wax fikrad ah uga haysan. Moodooyinkan maskaxeed wax badan kama duwana jaangooyooyinka miiska ee go'aaminaya sida aan u kala saarno una habeyno macluumaadka cusub.

Tani waxay ina keenaysaa arrinta maaraynta schema. Marka caqabadaha ganacsiga iyo shuruudaha ay isbeddelaan waqti ka dib, sidoo kale qaab dhismeedka xogtaada ayaa isbedelaya. Delta Lake waxay sahlaysaa in la soo bandhigo qiyaaso cusub marka xogtu is beddesho. Isticmaalayaashu waxay marin u heli karaan semantics fudud si ay u maareeyaan qorshayaasha miiska. Qalabkan waxaa ka mid ah hirgelinta Schema, kaas oo ka ilaaliya dadka isticmaala inay si ula kac ah u wasakheeyaan miisaska khaladaadka ama xogta aan loo baahnayn, iyo Schema Evolution, kaas oo u oggolaanaya tiirarka cusub ee xogta qiimaha leh in si toos ah loogu daro goobaha ku habboon. Maqaalkan, waxaan si qoto dheer ugu dhex milmi doonaa adeegsiga agabkan.

Fahamka Qorshaha Shaxda

DataFrame kasta ee Apache Spark waxa ku jira schema qeexaysa qaabka xogta, sida noocyada xogta, tiirarka, iyo xogta badan. Delta Lake, shaxda miiska waxa lagu kaydiyaa qaabka JSON gudaha logda wax kala iibsiga.

Waa maxay fulinta nidaamku?

Dhaqangelinta Schema, oo sidoo kale loo yaqaano Xaqiijinta Schema, waa hannaan ammaan oo ku jira harada Delta taasoo hubisa tayada xogta iyadoo la diidayo diiwaannada aan ku habboonayn qorshaha miiska. Sida martigeliyaha miiska hore ee makhaayad boos celin-kaliya oo caan ah, waxay hubisaa in tiir kasta oo xogta la geliyo miiska uu ku jiro liiska u dhigma ee tiirarka la filayo (si kale haddii loo dhigo, haddii ay jirto "boos" mid kasta oo iyaga ka mid ah). ), oo diidaya diiwaan kasta oo leh tiirar aan ku jirin liiska.

Sidee fulinta schema u shaqeysaa?

Delta Lake waxay isticmaashaa hubinta schema-on-write, taas oo macnaheedu yahay in dhammaan qoraallada cusub ee miiska lagu soo qoray la hubiyay inay la jaan qaadayaan shaxda bartilmaameedka wakhtiga qorista. Haddi qorshaha uu yahay mid aan is waafaqsanayn, Delta Lake waxa ay baabi'isaa wax kala iibsiga gabi ahaanba (xog ma qorna) oo waxa ay kor u qaadaa ka reebis si loo ogeysiiyo isticmaalaha iswaafaq la'aanta.
Delta Lake waxay isticmaashaa xeerarkan soo socda si ay u go'aamiso in diiwaanku la jaanqaadi karo miiska iyo in kale. DataFrame la qori karo:

  • kuma koobnaan karo tiirar dheeraad ah oo aan ku jirin shaxda bartilmaameedka. Taa bedelkeeda, wax walbaa way fiican yihiin haddii xogta soo socota aysan ku jirin gabi ahaanba dhammaan tiirarka miiska - tiirarkan ayaa si fudud loo qoondayn doonaa qiyamka null.
  • ma yeelan karaan noocyada xogta tiirarka oo ka duwan noocyada xogta tiirarka shaxda bartilmaameedka. Haddii tiirka miiska bartilmaameedku ka kooban yahay xogta StringType, laakiin tiirka u dhigma ee DataFrame ka kooban yahay xogta IntegerType, fulinta schema waxay tuuraysaa wax ka reeban oo waxay ka ilaalin doontaa in hawlgalka qorista uu dhaco.
  • kuma koobnaan karo magacyo safafka ah oo ku kala duwan haddii ay dhacdo. Tani waxay ka dhigan tahay inaadan lahaan karin tiirar lagu magacaabo 'Foo' iyo 'foo' oo lagu qeexay isku jaad. In kasta oo Spark loo isticmaali karo xaalad-xasaasi ah ama kiis-aan dareen lahayn (default), Delta Lake waa mid ilaalinaysa laakiin dareen la'aan bay ku tahay kaydinta schema. Parquet waa kiis xasaasi ah marka kaydinta iyo soo celinta macluumaadka tiirka. Si looga fogaado khaladaadka suurtagalka ah, musuqmaasuqa xogta, ama luminta xogta (wax aan shakhsi ahaan ula kulannay Databricks), waxaan go'aansanay inaan ku darno xaddidan.

Si taas loo caddeeyo, aan eegno waxa ka dhacaya koodka hoose marka aan isku dayno inaan ku darno tiirar cusub oo la soo saaray miiska Delta Lake oo aan weli loo habayn inuu aqbalo.

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

Halkii si toos ah loogu dari lahaa tiirar cusub, Delta Lake waxay soo rogtay qorshe waxayna joojisaa qorista. Si loo go'aamiyo tiirka (ama set of tiirarka) ee keenaya ismaan-dhaafka, Spark waxay soo saartaa labadaba schemas ee raadraaca isbarbardhigga.

Waa maxay faa'iidada ku jirta fulinta qorshaha?

Sababtoo ah fulinta schema waa hubin adag oo cadaalad ah, waa qalab aad u fiican oo loo isticmaalo irid-ilaaliye ahaan si loo helo xog nadiif ah oo si buuxda loo beddelay oo diyaar u ah wax soo saarka ama isticmaalka. Caadi ahaan waxaa lagu dabaqaa jaantusyada sida tooska ah u quudiya xogta:

  • Algorithms barashada mashiinka
  • BI dashboards
  • Qalabka falanqaynta xogta iyo aragga
  • Nidaam kasta oo wax-soo-saar oo u baahan qaab-dhismeed heer sare ah, oo si xooggan loo tebiyay schemas semantic.

Si loo diyaariyo xogtooda caqabadan kama dambaysta ah, isticmaaleyaal badan ayaa isticmaala qaab dhismeedka "multi-hop" fudud oo si tartiib tartiib ah u soo bandhigaya qaab-dhismeedka miisaskooda. Si aad wax badan uga ogaato arrintan, waxaad ka eegi kartaa maqaalka Barashada mashiinka heerka-soosaarka leh ee Delta Lake.

Dabcan, hirgelinta schema waxaa loo isticmaali karaa meel kasta oo ka mid ah dhuumahaaga, laakiin xusuusnow in u qulqulka miiska kiiskan ay noqon karto mid niyadjab leh sababtoo ah, tusaale ahaan, waxaad illowday inaad ku dartay tiir kale xogta soo socota.

Ka hortagga qaska xogta

Hadda waxa laga yaabaa inaad is waydiiso, waa maxay buuqa jira? Dhammaan ka dib, marmarka qaarkood qalad "schema mismatch" oo lama filaan ah ayaa kugu kicin kara socodka shaqadaada, gaar ahaan haddii aad ku cusub tahay Delta Lake. Waa maxay sababta aan u oggolaan oo keliya in qorshaha beddelo marka loo baahdo si aan u qori karo DataFrame-kayga wax kasta ha ahaatee?

Maahmaahdii hore ayaa tidhaahda, "wiqiyad ka-hortag ah waxay u qalantaa rodol dawo ah." Mar marka qaarkood, haddii aadan ka taxadarin inaad xoojiso qorshahaaga, arrimaha ku habboon nooca xogta ayaa dib u soo celin doona madaxooda foosha xun - ilaha xogta cayriin ee u muuqda waxay ka koobnaan karaan kiisas cidhiidhi ah, tiirar kharriban, khariidado khaldan, ama waxyaabo kale oo cabsi leh oo lagu riyoodo qarow. Habka ugu fiican ayaa ah in la joojiyo cadaawayaashan albaabka - iyadoo la fulinayo qorshe-hawleed - oo loola macaamilo iftiinka, halkii ay ka dib bilaabi lahaayeen inay ku dhuuntaan moolka mugdiga ah ee code-kaaga.

Dhaqangelinta schema waxay ku siinaysaa dammaanad ah in qorshaha miiskaagu aanu isbeddelayn ilaa aad ogolaato isbeddelka. Tani waxay ka hortagtaa dhuxusha xogta, taas oo dhici karta marka tiirar cusub lagu daro si isdaba joog ah taas oo markii hore qiimaha lahayd, miisaska ciriiriga ah ay lumiyaan macnahooda iyo faa'iidooyinkooda sababtoo ah qulqulka xogta. Adigoo kugu dhiirigelinaya inaad si ula kac ah u sameyso, dejiso heerar sare, oo aad filayso tayada sare, fulinta schema waxay si sax ah u qabataa waxa loogu talagalay in la sameeyo - waxay kaa caawineysaa inaad damiir yeelato oo xaashidaada aad nadiifiso.

Haddii tixgelin dheeraad ah aad go'aansato inaad runtii tahay u baahan tahay ku dar tiir cusub - dhib malahan, hoos waxaa ah hagaajin hal-line ah. Xalku waa horumarka wareegga!

Waa maxay horumarinta schema?

Horumarka Schema waa muuqaal u oggolaanaya isticmaaleyaasha inay si fudud u beddelaan shaxda miiska hadda jirta iyadoo loo eegayo xogta isbeddelaysa waqti ka dib. Inta badan waxaa la isticmaalaa marka la samaynayo lifaaq ama dib u qorida qalliin si si toos ah loogu habeeyo qorshaha si loogu daro hal ama dhowr tiir oo cusub.

Sidee buu u shaqeeyaa horumarinta schema?

Iyadoo la raacayo tusaalaha qaybta hore, horumariyayaashu waxay si fudud u isticmaali karaan kobcinta schema si ay ugu daraan tiirar cusub oo hore loo diiday sababtoo ah iswaafaq la'aanta schema. Kobcinta wareegtada waxa la dhaqaajiyaa iyadoo lagu darayo .option('mergeSchema', 'true') kooxdaada Spark .write ΠΈΠ»ΠΈ .writeStream.

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

Si aad u aragto garaafka, socodsii su'aalaha Spark SQL ee soo socda

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

U quuso harada Delta: Hirgelinta Qorshaha iyo Kobcinta
Haddii kale, waxaad dejin kartaa doorashadan dhammaan fadhiga Spark adiga oo ku daraya spark.databricks.delta.schema.autoMerge = True qaabeynta Spark. Laakin si taxadir leh u isticmaal tan, maadaama fulinta schema aysan mar dambe kaaga digayn iswaafaqla'aanta schema ee aan ula kac ahayn.

Adigoo ku daraya cabbirka codsiga mergeSchema, Dhammaan tiirarka ku jira DataFrame laakiin aan ku jirin shaxda bartilmaameedka ayaa si toos ah loogu daraa dhammaadka schema iyada oo qayb ka ah macaamil ganacsi. Beeraha buulka leh ayaa sidoo kale lagu dari karaa kuwan sidoo kale waxaa lagu dari doonaa dhamaadka tiirarka qaab dhismeedka u dhigma.

Injineerrada taariikhda iyo saynisyahannada xogta waxay isticmaali karaan ikhtiyaarkan si ay ugu daraan tiirar cusub (laga yaabee mitir dhawaan la raadiyay ama tiirarka waxqabadka iibka ee bishaan) miisaska wax soo saarka ee hadda jira ee mashiinka iyaga oo aan jebin moodooyinka jira ee ku saleysan tiirar hore.

Noocyada soo socda ee isbeddellada schema waa la oggol yahay iyada oo qayb ka ah horumarinta schema inta lagu jiro miiska ku-darka ama dib-u-qorista:

  • Ku darida tiirar cusub (tani waa dhacdada ugu caansan)
  • Beddelida noocyada xogta ee NullType -> nooc kasta oo kale ama ka xayeysiinta ByteType -> ShortType -> IntegerType

Isbeddellada kale ee aan la oggolayn gudaha horumarinta schema waxay u baahan yihiin in qorshaha iyo xogta dib loo qoro iyadoo lagu darayo .option("overwriteSchema", "true"). Tusaale ahaan, xaaladdu halka tiirka "Foo" uu asal ahaan ka ahaa halbeeg isla markaana qorshaha cusub uu ahaa nooca xogta xargaha, markaas dhammaan faylasha Parquet(xogta) waxay u baahan doonaan in dib loo qoro. Isbedelada noocaan ah waxaa ka mid ah:

  • Tirtir tiirka
  • bedelida nooca xogta ee tiirka jira (meesha)
  • Magacaabida tiirar ka duwan kiis keliya (tusaale, "Foo" iyo "foo")

Ugu dambeyntii, marka la sii daayo soo socota ee Spark 3.0, DDL cad ayaa si buuxda loo taageeri doonaa (iyadoo la adeegsanayo ALTER TABLE), taasoo u oggolaanaysa isticmaalayaasha inay ku sameeyaan tallaabooyinka soo socda ee shaxda miiska:

  • ku darida tiirarka
  • beddelka faallooyinka tiirka
  • dejinta guryaha miiska ee koontaroolaya dhaqanka miiska, sida dejinta dhererka wakhtiga kaydinta wax kala iibsiga.

Waa maxay faa'iidada horumarinta wareegyada?

Horumarka Schema waxa la isticmaali karaa mar kasta oo aad damacsan Beddel shaxda miiskaaga (oo ka duwan marka aad si lama filaan ah ugu dartay tiirar DataFrame kaaga ah oo aan ahayn inay halkaas joogaan). Tani waa habka ugu fudud ee loo haajiro qorshahaaga sababtoo ah waxay si toos ah ugu daraa magacyada safafka saxda ah iyo noocyada xogta iyada oo aan si cad loo sheegin.

gunaanad

Hirgelinta Schema waxay diidaysaa tiirar kasta oo cusub ama isbeddellada kale ee qorshaha ee aan ku habboonayn miiskaaga. Dejinta iyo ilaalinta heerarkan sare, falanqeeyayaasha iyo injineeradu waxay aamini karaan in xogtoodu ay leedahay heerka ugu sarreeya ee daacadnimada, si cad oo cad oo cad, u oggolaanaya inay sameeyaan go'aano ganacsi oo wanaagsan.

Dhanka kale, kobcinta schema waxay dhamaystiraysaa fulinta iyadoo la fududeynayo lagu eedeeyay Isbeddel toos ah oo schema Ka dib oo dhan, waa inaysan adkaan in lagu daro tiir.

Codsiga qasabka ah ee nidaamka waa yang, halkaas oo horumarka nidaamku yahay yin. Marka si wada jir ah loo isticmaalo, sifooyinkan ayaa ka dhigaya xakamaynta dhawaaqa iyo hagaajinta calaamadaha si ka sahlan sidii hore.

Waxaan sidoo kale u mahadcelineynaa Mukul Murthy iyo Pranav Anand gacantii ay ka geysteen maqaalkan.

Maqaallada kale ee taxanahan:

U quuso harada Delta: Furitaanka Log-ka wax kala iibsiga

Maqaallada La Xiriira

Barashada mashiinka heerka-soosaarka leh ee Delta Lake

Waa maxay harada xogtu?

Wax badan ka ogow koorsada

Source: www.habr.com

Add a comment