Роњење у Делта Лаке: Спровођење и еволуција шеме

Здраво, Хабр! Представљам вашој пажњи превод чланка „Роњење у Делта језеро: Спровођење шеме и еволуција“ аутори Бурак Иавуз, Бреннер Хеинтз и Денни Лее, који је припремљен у ишчекивању почетка курса Дата Енгинеер фром ОТУС.

Роњење у Делта Лаке: Спровођење и еволуција шеме

Подаци се, као и наше искуство, непрестано гомилају и развијају. Да бисмо одржали корак, наши ментални модели света морају се прилагодити новим подацима, од којих неки садрже нове димензије — нове начине посматрања ствари о којима раније нисмо имали појма. Ови ментални модели се не разликују много од шема табела које одређују како категоризујемо и обрађујемо нове информације.

Ово нас доводи до питања управљања шемама. Како се пословни изазови и захтеви мењају током времена, мења се и структура ваших података. Делта Лаке олакшава увођење нових мерења како се подаци мењају. Корисници имају приступ једноставној семантици за управљање својим шемама табела. Ови алати укључују примену шеме, која штити кориснике од ненамерног загађивања њихових табела грешкама или непотребним подацима, и развој шеме, који омогућава да се нове колоне вредних података аутоматски додају на одговарајуће локације. У овом чланку ћемо дубље заронити у коришћење ових алата.

Разумевање шема табела

Сваки ДатаФраме у Апацхе Спарк-у садржи шему која дефинише облик података, као што су типови података, колоне и метаподаци. Са Делта Лакеом, шема табеле се чува у ЈСОН формату унутар евиденције трансакција.

Шта је спровођење шеме?

Спровођење шеме, такође познато као провера шеме, је безбедносни механизам у Делта Лаке-у који обезбеђује квалитет података одбијањем записа који се не подударају са шемом табеле. Попут хостесе на рецепцији популарног ресторана само за резервације, она проверава да ли се свака колона података унета у табелу налази у одговарајућој листи очекиваних колона (другим речима, да ли постоји „резервација“ за сваку од њих ), и одбија све записе са колонама које нису на листи.

Како функционише примена шеме?

Делта Лаке користи проверу шеме при писању, што значи да се сва нова уписивања у табелу проверавају на компатибилност са шемом циљне табеле у време писања. Ако је шема недоследна, Делта Лаке у потпуности прекида трансакцију (не уписују се подаци) и покреће изузетак да би обавестио корисника о недоследности.
Делта Лаке користи следећа правила да утврди да ли је запис компатибилан са табелом. Уписив оквир података:

  • не може да садржи додатне колоне које нису у шеми циљне табеле. Насупрот томе, све је у реду ако долазни подаци не садрже апсолутно све колоне из табеле - овим колонама ће једноставно бити додељене нулте вредности.
  • не могу имати типове података колона који се разликују од типова података колона у циљној табели. Ако колона циљне табеле садржи податке СтрингТипе, али одговарајућа колона у ДатаФраме-у садржи податке типа ИнтегерТипе, примена шеме ће изазвати изузетак и спречити да се изврши операција писања.
  • не може да садржи називе колона који се разликују само у великим и великим словима. То значи да не можете имати колоне под називом 'Фоо' и 'фоо' дефинисане у истој табели. Док Спарк може да се користи у режиму осетљивом на велика или мала слова (подразумевано), Делта Лаке чува велика и мала слова, али је неосетљив у оквиру складишта шеме. Паркет је осетљив на велика и мала слова приликом складиштења и враћања информација о колони. Да бисмо избегли могуће грешке, оштећење података или губитак података (што смо лично искусили у Датабрицкс-у), одлучили смо да додамо ово ограничење.

Да бисмо ово илустровали, хајде да погледамо шта се дешава у коду испод када покушамо да додамо неке новогенерисане колоне у табелу Делта Лаке која још није конфигурисана да их прихвати.

# Сгенерируем 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.

Уместо да аутоматски додаје нове колоне, Делта Лаке намеће шему и зауставља писање. Да би се утврдило која колона (или скуп колона) узрокује неслагање, Спарк даје обе шеме из праћења стека ради поређења.

Која је корист од примене шеме?

Пошто је примена шеме прилично строга провера, то је одличан алат за коришћење као чувар чистог, потпуно трансформисаног скупа података који је спреман за производњу или потрошњу. Обично се примењује на табеле које директно уносе податке:

  • Алгоритми машинског учења
  • БИ контролне табле
  • Аналитика података и алати за визуелизацију
  • Сваки производни систем који захтева високо структуриране, снажно откуцане семантичке шеме.

Да би припремили своје податке за ову последњу препреку, многи корисници користе једноставну архитектуру „више скокова“ која постепено уводи структуру у њихове табеле. Да бисте сазнали више о овоме, можете погледати чланак Машинско учење на нивоу производње уз Делта Лаке.

Наравно, примена шеме се може користити било где у вашем цевоводу, али запамтите да стримовање у табелу у овом случају може бити фрустрирајуће јер сте, на пример, заборавили да сте додали још једну колону долазним подацима.

Спречавање разводњавања података

До сада се можда питате око чега је толика гужва? На крају крајева, понекад неочекивана грешка „неусклађености шеме“ може да вас збуни у току посла, посебно ако сте нови у Делта Лакеу. Зашто једноставно не дозволите да се шема промени по потреби тако да могу да напишем свој ДатаФраме без обзира на све?

Како стара изрека каже, „унца превенције вреди фунту лечења“. У неком тренутку, ако не водите рачуна да примените своју шему, проблеми са компатибилношћу типова података ће изазвати своје ружне главе – наизглед хомогени извори сирових података могу садржати рубне случајеве, оштећене колоне, деформисана мапирања или друге страшне ствари о којима можете сањати ноћне море. Најбољи приступ је да зауставите ове непријатеље на капији - применом шеме - и да се носите са њима на светлу, а не касније када почну да вребају у мрачним дубинама вашег производног кода.

Примена шеме вам даје сигурност да се шема ваше табеле неће променити осим ако не одобрите промену. Ово спречава разводњавање података, до чега може доћи када се нове колоне додају тако често да раније вредне, компримоване табеле губе смисао и корисност услед поплаве података. Подстичући вас да будете намерни, постављате високе стандарде и очекујете висок квалитет, примена шеме чини управо оно за шта је дизајнирана — помаже вам да останете савесни и да ваше табеле буду чисте.

Ако даљим разматрањем одлучите да заиста потреба додајте нову колону - нема проблема, испод је исправка у једном реду. Решење је еволуција кола!

Шта је еволуција шеме?

Еволуција шеме је функција која омогућава корисницима да лако промене тренутну шему табеле у складу са подацима који се мењају током времена. Најчешће се користи када се врши операција додавања или поновног писања да би се схема аутоматски прилагодила да укључи једну или више нових колона.

Како функционише еволуција шеме?

Пратећи пример из претходног одељка, програмери могу лако да користе еволуцију шеме да додају нове колоне које су претходно одбијене због недоследности шеме. Еволуција кола се активира додавањем .option('mergeSchema', 'true') вашем Спарк тиму .write или .writeStream.

# Добавьте параметр mergeSchema
loans.write.format("delta") 
           .option("mergeSchema", "true") 
           .mode("append") 
           .save(DELTALAKE_SILVER_PATH)

Да бисте видели графикон, покрените следећи Спарк СКЛ упит

# Создайте график с новым столбцом, чтобы подтвердить, что запись прошла успешно
%sql
SELECT addr_state, sum(`amount`) AS amount
FROM loan_by_state_delta
GROUP BY addr_state
ORDER BY sum(`amount`)
DESC LIMIT 10

Роњење у Делта Лаке: Спровођење и еволуција шеме
Алтернативно, можете поставити ову опцију за целу Спарк сесију додавањем spark.databricks.delta.schema.autoMerge = True на конфигурацију Спарк. Али користите ово са опрезом, јер вас примена шеме више неће упозоравати на ненамерне недоследности шеме.

Укључивањем параметра у захтев mergeSchema, све колоне које су присутне у ДатаФраме-у, али не у циљној табели се аутоматски додају на крај шеме као део трансакције писања. Угнежђена поља се такође могу додати и она ће такође бити додата на крај одговарајућих колона структуре.

Инжењери датума и научници података могу да користе ову опцију да додају нове колоне (можда недавно праћену метрику или колону учинка продаје овог месеца) у своје постојеће производне табеле машинског учења без прекидања постојећих модела заснованих на старим колонама.

Следећи типови промена шеме су дозвољени као део еволуције шеме током додавања или преписивања табеле:

  • Додавање нових колона (ово је најчешћи сценарио)
  • Промена типова података из НуллТипе -> било којег другог типа или промовисање из БитеТипе -> СхортТипе -> ИнтегерТипе

Друге промене које нису дозвољене у оквиру еволуције шеме захтевају да се шема и подаци поново напишу додавањем .option("overwriteSchema", "true"). На пример, у случају када је колона „Фоо“ првобитно била цео број, а нова шема је била стринг тип података, тада би све датотеке Паркета(података) требало да буду преписане. Такве промене укључују:

  • брисање колоне
  • промена типа података постојеће колоне (на месту)
  • преименовање колона које се разликују само у великим и великим словима (на пример, „Фоо“ и „фоо“)

Коначно, са следећим издањем Спарк 3.0, експлицитни ДДЛ ће бити у потпуности подржан (користећи АЛТЕР ТАБЛЕ), омогућавајући корисницима да изврше следеће радње на шемама табела:

  • додавање колона
  • мењање коментара колоне
  • подешавање својстава табеле која контролишу понашање табеле, као што је подешавање дужине времена складиштења евиденције трансакција.

Која је корист од еволуције кола?

Еволуција шеме се може користити кад год Намеравам промените шему своје табеле (за разлику од када сте случајно додали колоне у свој ДатаФраме које не би требало да буду тамо). Ово је најлакши начин да мигрирате своју шему јер аутоматски додаје исправна имена колона и типове података без потребе да их експлицитно декларирате.

Закључак

Примена шеме одбија све нове колоне или друге промене шеме које нису компатибилне са вашом табелом. Постављањем и одржавањем ових високих стандарда, аналитичари и инжењери могу веровати да њихови подаци имају највиши ниво интегритета, саопштавајући их јасно и јасно, омогућавајући им да доносе боље пословне одлуке.

С друге стране, еволуција шеме допуњује спровођење поједностављивањем претпостављено аутоматске промене шеме. На крају крајева, не би требало да буде тешко додати колону.

Принудна примена шеме је јанг, где је еволуција шеме јин. Када се користе заједно, ове функције чине потискивање шума и подешавање сигнала лакшим него икад.

Такође бисмо желели да се захвалимо Мукул Муртхију и Пранаву Ананду на њиховом доприносу овом чланку.

Остали чланци у овој серији:

Зароните у Делта Лаке: Распакивање дневника трансакција

повезани чланци

Машинско учење на нивоу производње уз Делта Лаке

Шта је језеро података?

Сазнајте више о курсу

Извор: ввв.хабр.цом

Додај коментар