Delta Lake Dive: Utekelezaji na Mageuzi ya Mpango

Habari Habr! Ninawasilisha kwa mawazo yako tafsiri ya makala "Kuingia kwenye Ziwa la Delta: Utekelezaji wa Schema na Mageuzi" waandishi Burak Yavuz, Brenner Heintz na Denny Lee, ambayo ilitayarishwa kwa kutarajia kuanza kwa kozi hiyo. Mhandisi wa Data kutoka OTUS.

Delta Lake Dive: Utekelezaji na Mageuzi ya Mpango

Data, kama vile uzoefu wetu, inajikusanya na kubadilika kila mara. Ili kuendelea, miundo yetu ya kiakili ya ulimwengu lazima ikubaliane na data mpya, ambayo baadhi yake ina vipimo vipyaβ€”njia mpya za kuchunguza mambo ambayo hatukuwa tukiyafahamu hapo awali. Miundo hii ya kiakili si tofauti sana na taratibu za jedwali zinazobainisha jinsi tunavyopanga na kuchakata taarifa mpya.

Hii inatuleta kwenye suala la usimamizi wa schema. Kadiri changamoto na mahitaji ya biashara yanavyobadilika kadiri muda unavyopita, ndivyo muundo wa data yako unavyobadilika. Delta Lake hurahisisha kutambulisha vipimo vipya data inapobadilika. Watumiaji wanaweza kufikia semantiki rahisi ili kudhibiti taratibu zao za jedwali. Zana hizi ni pamoja na Utekelezaji wa Schema, ambao hulinda watumiaji dhidi ya kuchafua jedwali zao bila kukusudia kwa hitilafu au data isiyo ya lazima, na Schema Evolution, ambayo huruhusu safu wima mpya za data muhimu kuongezwa kiotomatiki kwenye maeneo yanayofaa. Katika makala haya, tutazama zaidi katika kutumia zana hizi.

Kuelewa Miradi ya Jedwali

Kila DataFrame katika Apache Spark ina taratibu zinazofafanua aina ya data, kama vile aina za data, safu wima na metadata. Na Delta Lake, schema ya jedwali huhifadhiwa katika umbizo la JSON ndani ya logi ya muamala.

Utekelezaji wa mpango ni nini?

Utekelezaji wa Schema, unaojulikana pia kama Uthibitishaji wa Schema, ni utaratibu wa usalama katika Delta Lake ambao huhakikisha ubora wa data kwa kukataa rekodi ambazo hazilingani na taratibu za jedwali. Kama vile mhudumu kwenye dawati la mbele la mkahawa maarufu wa kuweka nafasi pekee, yeye hukagua ikiwa kila safu ya data iliyoingizwa kwenye jedwali iko kwenye orodha inayolingana ya safu wima zinazotarajiwa (kwa maneno mengine, ikiwa kuna "hifadhi" kwa kila moja yao. ), na inakataa rekodi zozote zilizo na safu wima ambazo haziko kwenye orodha.

Utekelezaji wa schema hufanyaje kazi?

Delta Lake hutumia ukaguzi wa schema-on-write, ambayo inamaanisha kuwa maandishi yote mapya kwenye jedwali yanakaguliwa ili kuafikiana na schema ya jedwali lengwa wakati wa kuandika. Ikiwa utaratibu haulingani, Delta Lake itabatilisha muamala kabisa (hakuna data iliyoandikwa) na kutoa hali ya kutofuata kanuni ili kumjulisha mtumiaji kuhusu kutofautiana.
Delta Lake hutumia sheria zifuatazo kubainisha ikiwa rekodi inaoana na jedwali. Mfumo wa Data Unaoweza Kuandikwa:

  • haiwezi kuwa na safu wima za ziada ambazo haziko katika taratibu za jedwali lengwa. Kinyume chake, kila kitu ni sawa ikiwa data inayoingia haina kabisa safu wima zote kutoka kwa jedwali - safu wima hizi zitapewa tu maadili yasiyofaa.
  • haiwezi kuwa na aina za data za safu wima ambazo ni tofauti na aina za data za safu wima kwenye jedwali lengwa. Ikiwa safu wima ya jedwali lengwa ina data ya StringType, lakini safu wima inayolingana katika DataFrame ina data ya IntegerType, utekelezaji wa taratibu utatupa ubaguzi na kuzuia utendakazi wa uandishi kufanyika.
  • haiwezi kuwa na majina ya safu wima ambayo hutofautiana ikiwa tu. Hii inamaanisha kuwa huwezi kuwa na safu wima zinazoitwa 'Foo' na 'foo' zilizofafanuliwa kwenye jedwali moja. Ingawa Spark inaweza kutumika katika hali nyeti sana au isiyojali kesi (chaguo-msingi), Delta Lake inahifadhi vipodozi lakini haijali ndani ya hifadhi ya taratibu. Parquet ni nyeti wakati wa kuhifadhi na kurejesha maelezo ya safu wima. Ili kuepuka makosa yanayoweza kutokea, upotovu wa data au upotezaji wa data (jambo ambalo sisi binafsi tulikumbana nalo kwenye Databricks), tuliamua kuongeza kizuizi hiki.

Ili kufafanua hili, hebu tuangalie kile kinachotokea katika msimbo ulio hapa chini tunapojaribu kuongeza safu wima mpya kwenye jedwali la Delta Lake ambalo bado halijasanidiwa kuzikubali.

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

Badala ya kuongeza safu wima mpya kiotomatiki, Delta Lake inaweka schema na inaacha kuandika. Ili kusaidia kubainisha ni safu wima ipi (au seti ya safu wima) inayosababisha hitilafu, Spark hutoa taratibu zote mbili kutoka kwa ufuatiliaji wa rafu kwa kulinganisha.

Ni faida gani ya kutekeleza schema?

Kwa sababu utekelezaji wa taratibu ni ukaguzi mkali, ni zana bora ya kutumia kama mlinda lango kwa seti safi ya data iliyobadilishwa kikamilifu ambayo iko tayari kwa uzalishaji au matumizi. Kwa kawaida hutumika kwa jedwali zinazolisha data moja kwa moja:

  • Kanuni za kujifunza mashine
  • Dashibodi za BI
  • Uchambuzi wa data na zana za kuona
  • Mfumo wowote wa uzalishaji ambao unahitaji miundo ya kisemantiki iliyopangwa kwa kiwango cha juu, iliyochapwa kwa nguvu.

Ili kuandaa data zao kwa kikwazo hiki cha mwisho, watumiaji wengi hutumia usanifu rahisi wa "multi-hop" ambao polepole huleta muundo kwenye meza zao. Ili kujifunza zaidi kuhusu hili, unaweza kuangalia makala Kujifunza kwa mashine ya kiwango cha uzalishaji na Delta Lake.

Kwa kweli, utekelezaji wa schema unaweza kutumika mahali popote kwenye bomba lako, lakini kumbuka kuwa kutiririsha kwenye jedwali katika kesi hii kunaweza kufadhaisha kwa sababu, kwa mfano, umesahau kuwa umeongeza safu wima nyingine kwenye data inayoingia.

Kuzuia dilution ya data

Kwa sasa unaweza kujiuliza, ugomvi wa nini? Baada ya yote, wakati mwingine hitilafu isiyotarajiwa ya "schema isiyolingana" inaweza kukuarifu katika utiririshaji wako wa kazi, haswa ikiwa wewe ni mgeni kwenye Delta Lake. Kwa nini usiruhusu tu schema ibadilike inavyohitajika ili niweze kuandika DataFrame yangu haijalishi ni nini?

Kama msemo wa zamani unavyosema, "kiasi cha kuzuia ni sawa na pauni moja ya tiba." Wakati fulani, usipotunza kutekeleza utaratibu wako, masuala ya uoanifu wa aina ya data yataibua vichwa vyao vibaya - vyanzo vya data mbichi vinavyoonekana kuwa sawa vinaweza kuwa na visa vya ukingo, safu wima mbovu, upangaji mbovu, au mambo mengine ya kutisha ya kuota. jinamizi. Mbinu bora ni kuwazuia maadui hawa langoni - kwa utekelezaji wa schema - na kukabiliana nao kwenye mwanga, badala ya baadaye wakati wanaanza kuvizia kwenye giza kuu la msimbo wako wa uzalishaji.

Utekelezaji wa schema hukupa hakikisho kwamba utaratibu wa jedwali lako hautabadilika isipokuwa uidhinishe mabadiliko. Hii huzuia upunguzaji wa data, ambao unaweza kutokea wakati safu wima mpya zinaongezwa mara kwa mara hivi kwamba majedwali yenye thamani ya awali, yaliyobanwa hupoteza maana na manufaa kutokana na data iliyojazwa. Kwa kukuhimiza kukusudia, kuweka viwango vya juu, na kutarajia ubora wa juu, utekelezaji wa taratibu hufanya kama ulivyobuniwa kufanyaβ€”kusaidia kuwa mwangalifu na lahajedwali zako zikiwa safi.

Ikiwa kwa kuzingatia zaidi utaamua kuwa kweli unahitaji ongeza safu mpya - hakuna shida, hapa chini ni marekebisho ya mstari mmoja. Suluhisho ni mageuzi ya mzunguko!

Mageuzi ya schema ni nini?

Mageuzi ya schema ni kipengele kinachoruhusu watumiaji kubadilisha kwa urahisi utaratibu wa sasa wa jedwali kulingana na data inayobadilika kwa wakati. Mara nyingi hutumika wakati wa kutekeleza nyongeza au kuandika upya operesheni ili kurekebisha kiotomatiki utaratibu ili kujumuisha safu wima moja au zaidi.

Mageuzi ya schema hufanyaje kazi?

Kwa kufuata mfano kutoka sehemu iliyotangulia, wasanidi programu wanaweza kutumia mageuzi ya schema kwa urahisi kuongeza safu wima mpya ambazo zilikataliwa hapo awali kwa sababu ya kutofautiana kwa schema. Mageuzi ya mzunguko yanaamilishwa kwa kuongeza .option('mergeSchema', 'true') kwa timu yako ya Spark .write ΠΈΠ»ΠΈ .writeStream.

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

Ili kutazama grafu, endesha hoja ifuatayo ya Spark SQL

# Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊ с Π½ΠΎΠ²Ρ‹ΠΌ столбцом, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ запись ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ
%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: Utekelezaji na Mageuzi ya Mpango
Vinginevyo, unaweza kuweka chaguo hili kwa kipindi kizima cha Spark kwa kuongeza spark.databricks.delta.schema.autoMerge = True kwa usanidi wa Spark. Lakini tumia hii kwa tahadhari, kwani utekelezaji wa schema hautakuarifu tena kutoendana kwa schema bila kukusudia.

Kwa kujumuisha kigezo katika ombi mergeSchema, safu wima zote ambazo zipo katika DataFrame lakini haziko kwenye jedwali lengwa huongezwa kiotomatiki hadi mwisho wa schema kama sehemu ya shughuli ya uandishi. Sehemu zilizopachikwa pia zinaweza kuongezwa na hizi pia zitaongezwa hadi mwisho wa safu wima zinazolingana.

Wahandisi wa tarehe na wanasayansi wa data wanaweza kutumia chaguo hili kuongeza safu wima mpya (labda kipimo kilichofuatiliwa hivi majuzi au safu wima ya utendaji wa mauzo ya mwezi huu) kwenye majedwali yao yaliyopo ya uzalishaji wa mashine bila kuvunja miundo iliyopo kulingana na safu wima za zamani.

Aina zifuatazo za mabadiliko ya schema zinaruhusiwa kama sehemu ya mabadiliko ya schema wakati wa kuongeza au kuandika upya jedwali:

  • Kuongeza safu wima mpya (hii ndiyo hali inayojulikana zaidi)
  • Kubadilisha aina za data kutoka NullType -> aina nyingine yoyote au kukuza kutoka ByteType -> ShortType -> IntegerType

Mabadiliko mengine ambayo hayaruhusiwi ndani ya mabadiliko ya schema yanahitaji kwamba schema na data iandikwe upya kwa kuongeza .option("overwriteSchema", "true"). Kwa mfano, katika kesi ambapo safu wima "Foo" hapo awali ilikuwa nambari kamili na schema mpya ilikuwa aina ya data ya mfuatano, basi faili zote za Parquet(data) zingehitaji kuandikwa upya. Mabadiliko kama haya ni pamoja na:

  • kufuta safu
  • kubadilisha aina ya data ya safu wima iliyopo (mahali)
  • kubadilisha safu wima ambazo hutofautiana tu ikiwa (kwa mfano, "Foo" na "foo").

Hatimaye, kwa toleo linalofuata la Spark 3.0, DDL dhahiri itaauniwa kikamilifu (kwa kutumia ALTER TABLE), kuruhusu watumiaji kutekeleza vitendo vifuatavyo kwenye taratibu za jedwali:

  • kuongeza safu
  • kubadilisha maoni ya safuwima
  • kuweka sifa za jedwali zinazodhibiti tabia ya jedwali, kama vile kuweka urefu wa muda ambao kumbukumbu ya muamala inahifadhiwa.

Ni faida gani ya mageuzi ya mzunguko?

Mageuzi ya schema yanaweza kutumika wakati wowote kusudia badilisha schema ya jedwali lako (kinyume na wakati uliongeza safu wima kwa bahati mbaya kwenye DataFrame yako ambayo haifai kuwa hapo). Hii ndiyo njia rahisi zaidi ya kuhamisha utaratibu wako kwa sababu huongeza kiotomatiki majina ya safu wima na aina sahihi za data bila kulazimika kuzitangaza waziwazi.

Hitimisho

Utekelezaji wa taratibu hukataa safu wima zozote mpya au mabadiliko mengine ya taratibu ambayo hayaoani na jedwali lako. Kwa kuweka na kudumisha viwango hivi vya juu, wachambuzi na wahandisi wanaweza kuamini kuwa data yao ina kiwango cha juu zaidi cha uadilifu, kuiwasilisha kwa uwazi na kwa uwazi, na kuwaruhusu kufanya maamuzi bora zaidi ya biashara.

Kwa upande mwingine, mageuzi ya schema yanakamilisha utekelezaji kwa kurahisisha inadaiwa mabadiliko ya schema otomatiki. Baada ya yote, haipaswi kuwa vigumu kuongeza safu.

Utumiaji wa kulazimishwa wa mpango huo ni yang, ambapo mageuzi ya mpango huo ni yin. Zinapotumiwa pamoja, vipengele hivi hurahisisha ukandamizaji wa kelele na upangaji wa mawimbi kuliko hapo awali.

Pia tungependa kuwashukuru Mukul Murthy na Pranav Anand kwa michango yao katika makala hii.

Nakala zingine katika safu hii:

Ingia kwenye Delta Lake: Kufungua Regi ya Muamala

Makala Zinazohusiana

Kujifunza kwa mashine ya kiwango cha uzalishaji na Delta Lake

Ziwa la data ni nini?

Pata maelezo zaidi kuhusu kozi

Chanzo: mapenzi.com

Kuongeza maoni