Делта Лейк мубтало: татбиқ ва эволютсияи схема

Салом, Хабр! Ман ба диққати шумо тарҷумаи мақоларо пешкаш мекунам "Гавиш ба кӯли Делта: татбиқи схема ва эволютсия" муаллифон Бурак Явуз, Бреннер Ҳайнтз ва Денни Ли, ки дар арафаи оғози курс омода шудаанд Муҳандиси маълумот аз OTUS.

Делта Лейк мубтало: татбиқ ва эволютсияи схема

Маълумот, монанди таҷрибаи мо, пайваста ҷамъ мешавад ва инкишоф меёбад. Барои нигоҳ доштан, моделҳои ақлии мо дар ҷаҳон бояд ба маълумоти нав мутобиқ шаванд, ки баъзеи онҳо андозаҳои навро дар бар мегиранд - роҳҳои нави мушоҳидаи чизҳое, ки мо қаблан дар бораи он тасаввурот надоштем. Ин моделҳои равонӣ аз схемаҳои ҷадвал, ки чӣ гуна мо иттилооти навро гурӯҳбандӣ ва коркард мекунем, фарқи зиёд надоранд.

Ин моро ба масъалаи идоракунии схема меорад. Вақте ки мушкилот ва талаботҳои тиҷоратӣ бо мурури замон тағир меёбанд, сохтори маълумоти шумо низ тағйир меёбад. Делта Лейк ворид кардани андозагирии навро ҳангоми тағир додани маълумот осон мекунад. Истифодабарандагон ба семантикаи оддӣ дастрасӣ доранд, то схемаҳои ҷадвали худро идора кунанд. Ба ин абзорҳо дохил мешаванд Schema Enforement, ки корбаронро аз ногаҳон ифлос кардани ҷадвалҳои онҳоро бо хатогиҳо ё маълумоти нолозим муҳофизат мекунад ва Schema Evolution, ки имкон медиҳад сутунҳои нави маълумоти арзишманд ба таври худкор ба ҷойҳои мувофиқ илова карда шаванд. Дар ин мақола, мо ба истифодаи ин асбобҳо амиқтар меомӯзем.

Фаҳмидани схемаҳои ҷадвал

Ҳар як DataFrame дар Apache Spark дорои схемаест, ки шакли маълумотро муайян мекунад, ба монанди намудҳои додаҳо, сутунҳо ва метадата. Бо Delta Lake, схемаи ҷадвал дар формати JSON дар дохили сабти транзаксия нигоҳ дошта мешавад.

Иҷрои нақша чист?

Татбиқи схема, ки бо номи Шаҳодатномаи схема низ маълум аст, як механизми амниятӣ дар Лейк Delta мебошад, ки сифати маълумотро тавассути рад кардани сабтҳое, ки ба схемаи ҷадвал мувофиқат намекунанд, таъмин мекунад. Мисли соҳибхона дар мизи кории тарабхонаи машҳури танҳо барои фармоиш, вай месанҷад, ки оё ҳар як сутуни маълумоти ба ҷадвал воридшуда дар рӯйхати мувофиқи сутунҳои интизорӣ мавҷуд аст ё не (ба ибораи дигар, барои ҳар яки онҳо "брон" вуҷуд дорад ё не ). ва ҳама сабтҳоро бо сутунҳое, ки дар рӯйхат нестанд, рад мекунад.

Иҷрои схема чӣ гуна кор мекунад?

Delta Lake санҷиши схема-оид ба навиштанро истифода мебарад, ки ин маънои онро дорад, ки ҳама навиштаҳои нав ба ҷадвал барои мувофиқат бо схемаи ҷадвали ҳадаф дар вақти навиштан санҷида мешаванд. Агар схема номувофиқ бошад, Delta Lake транзаксияро комилан қатъ мекунад (ягон маълумот навишта нашудааст) ва истисноро барои огоҳ кардани корбар дар бораи номувофиқатӣ меорад.
Делта Лейк қоидаҳои зеринро истифода мебарад, то муайян кунад, ки оё сабт бо ҷадвал мувофиқ аст. DataFrame навишташаванда:

  • наметавонад дорои сутунҳои иловагие бошад, ки дар схемаи ҷадвали мақсаднок нестанд. Баръакс, ҳама чиз хуб аст, агар маълумоти воридотӣ комилан ҳама сутунҳои ҷадвалро дар бар нагирад - ба ин сутунҳо танҳо арзишҳои нул таъин карда мешаванд.
  • наметавонад намудҳои маълумоти сутунро дошта бошад, ки аз намудҳои маълумоти сутунҳои ҷадвали мақсаднок фарқ мекунанд. Агар сутуни ҷадвали мақсаднок маълумоти StringType дошта бошад, аммо сутуни мувофиқ дар DataFrame дорои маълумоти IntegerType бошад, иҷрои схема истисноро меандозад ва аз анҷом додани амалиёти навиштан пешгирӣ мекунад.
  • номҳои сутунҳоро дар бар гирифта наметавонанд, ки танҳо дар сурати фарқ мекунанд. Ин маънои онро дорад, ки шумо наметавонед сутунҳои бо номи 'Foo' ва 'foo' дар як ҷадвал муайян карда шаванд. Дар ҳоле ки Spark метавонад дар реҷаи ҳассос ба ҳарфҳо ё ба ҳарфи ҳарфҳо (пешфарз) истифода шавад, Delta Lake ҳарфҳоро ҳифз мекунад, аммо дар дохили нигаҳдории схема ҳассос аст. Паркет ҳангоми нигоҳдорӣ ва баргардонидани маълумоти сутун ба ҳарфҳо ҳассос аст. Барои пешгирӣ кардани хатогиҳои эҳтимолӣ, фасоди маълумот ё талафи маълумот (чизе ки мо шахсан дар Databricks аз сар гузаронидаем), мо тасмим гирифтем, ки ин маҳдудиятро илова кунем.

Барои нишон додани ин, биёед бубинем, ки дар коди зер чӣ рӯй медиҳад, вақте ки мо кӯшиш мекунем, ки баъзе сутунҳои навтаъсисшударо ба ҷадвали Делта Лейк, ки ҳанӯз барои қабули онҳо танзим нашудаанд, илова кунем.

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

Ба ҷои ба таври худкор илова кардани сутунҳои нав, Делта Лейк схемаро ҷорӣ мекунад ва навиштанро қатъ мекунад. Барои муайян кардани он, ки кадом сутун (ё маҷмӯи сутунҳо) боиси ихтилоф мегардад, Spark ҳарду схемаро аз пайгирии стек барои муқоиса мебарорад.

Иҷрои схема чӣ фоида дорад?

Азбаски иҷрои схема як санҷиши хеле сахт аст, он як воситаи олиҷанобест барои истифода ба сифати дарвозабон ба маҷмӯи маълумоти тоза ва комилан табдилёфта, ки барои истеҳсол ё истеъмол омода аст. Одатан ба ҷадвалҳое истифода мешаванд, ки мустақиман маълумотро таъмин мекунанд:

  • Алгоритмҳои омӯзиши мошинҳо
  • панелҳои BI
  • Воситаҳои таҳлили маълумот ва визуализатсия
  • Ҳама гуна системаи истеҳсолӣ, ки схемаҳои семантикии хеле сохторӣ ва сахт чопшударо талаб мекунад.

Барои омода кардани маълумоти худ ба ин монеаи ниҳоӣ, бисёр корбарон аз меъмории оддии "мулти-хоп" истифода мебаранд, ки тадриҷан сохторро ба ҷадвалҳои худ ворид мекунад. Барои гирифтани маълумоти бештар дар бораи ин, шумо метавонед мақоларо тафтиш кунед Омӯзиши мошини дараҷаи истеҳсолӣ бо Делта Лейк.

Албатта, иҷрои схемаро дар ҳама ҷо дар лӯлаи шумо истифода бурдан мумкин аст, аммо дар хотир доред, ки ҷараён ба ҷадвал дар ин ҳолат метавонад рӯҳафтода бошад, зеро масалан, шумо фаромӯш кардаед, ки шумо ба маълумоти воридотӣ сутуни дигар илова кардаед.

Пешгирии паҳншавии маълумот

Ҳоло шумо шояд дар ҳайрат бошед, ки ин ҳама ғавғо дар чист? Баъд аз ҳама, баъзан хатои ғайричашмдошти "мутобиқати схема" метавонад шуморо дар ҷараёни кори шумо халалдор кунад, хусусан агар шумо дар Делта Лейк нав бошед. Чаро на танҳо иҷозат надиҳед, ки схема дар ҳолати зарурӣ тағир ёбад, то ман новобаста аз он ки ман DataFrame-и худро нависам?

Чунон ки дар урфият мегуянд, «як унция пешгирй ба як фунт табобат арзиш дорад». Дар баъзе мавридҳо, агар шумо барои иҷрои нақшаи худ ғамхорӣ накунед, мушкилоти мутобиқати навъи додаҳо боиси зишти онҳо мешаванд - манбаҳои ба назар якхелаи хоми додашуда метавонанд ҳолатҳои канорӣ, сутунҳои вайроншуда, харитасозии нодуруст ё дигар чизҳои даҳшатнокро дар бар гиранд. хобҳои даҳшатовар. Беҳтарин равиш ин аст, ки ин душманонро дар назди дарвоза боздоред - бо иҷрои схема - ва бо онҳо дар рӯшноӣ мубориза баред, на дертар вақте ки онҳо дар умқи торикии коди истеҳсолии шумо пинҳон мешаванд.

Татбиқи схема ба шумо итминон медиҳад, ки схемаи ҷадвали шумо то он даме, ки тағиротро тасдиқ накунед, тағир намеёбад. Ин камшавии маълумотро пешгирӣ мекунад, ки он метавонад ҳангоми зуд-зуд илова кардани сутунҳои нав рух диҳад, ки ҷадвалҳои қаблан арзишманди фишурдашуда аз сабаби обхезии додаҳо маъно ва фоиданокии худро гум мекунанд. Бо ташвиқ кардани шумо ба қасдан будан, муқаррар кардани стандартҳои баланд ва интизории сифати баланд, иҷрои схема маҳз ҳамон чизеро, ки барои иҷроиш тарҳрезӣ шуда буд, иҷро мекунад - ба шумо кӯмак мекунад, ки софдилона нигоҳ доред ва ҷадвалҳои электронии худро тоза нигоҳ доред.

Агар пас аз баррасии минбаъда шумо қарор кунед, ки шумо дар ҳақиқат зарур аст сутуни нав илова кунед - ҳеҷ мушкиле нест, дар зер ислоҳи як сатр аст. Ҳалли ин эволютсияи схема аст!

Эволютсияи схема чист?

Эволютсияи схема ин хусусиятест, ки ба корбарон имкон медиҳад, ки схемаи ҷадвали ҷорӣро мувофиқи маълумоте, ки бо мурури замон тағйир меёбад, ба осонӣ иваз кунанд. Он аксар вақт ҳангоми иҷрои амалиёти замима ё азнавнавишт барои ба таври худкор мутобиқ кардани схема ба дохил кардани як ё якчанд сутунҳои нав истифода мешавад.

Эволютсияи схема чӣ гуна кор мекунад?

Пас аз мисоли бахши қаблӣ, таҳиягарон метавонанд ба осонӣ таҳаввулоти схемаро барои илова кардани сутунҳои нав истифода баранд, ки қаблан аз сабаби номувофиқатии схема рад карда шуда буданд. Эволютсияи схема тавассути илова фаъол карда мешавад .option('mergeSchema', 'true') ба дастаи Spark-и шумо .write или .writeStream.

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

Барои дидани график, дархости зерини 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

Делта Лейк мубтало: татбиқ ва эволютсияи схема
Интихобан, шумо метавонед ин хосиятро барои тамоми сессияи Spark бо илова насб кунед spark.databricks.delta.schema.autoMerge = True ба конфигуратсияи Spark. Аммо аз ин бо эҳтиёт истифода баред, зеро иҷрои схема дигар шуморо аз номувофиқатии схемаҳои ногаҳонӣ огоҳ намекунад.

Бо дохил кардани параметр дар дархост mergeSchema, ҳама сутунҳое, ки дар DataFrame мавҷуданд, вале дар ҷадвали мақсаднок нестанд, ба таври худкор ба охири схема ҳамчун як қисми амалиёти навиштан илова карда мешаванд. Майдонҳои дохилшуда низ метавонанд илова карда шаванд ва онҳо низ ба охири сутунҳои сохтори мувофиқ илова карда мешаванд.

Муҳандисони маълумот ва олимони маълумот метавонанд ин хосиятро барои илова кардани сутунҳои нав (шояд метрикаи ба наздикӣ пайгирӣшуда ё сутуни нишондиҳандаҳои фурӯши ин моҳ) ба ҷадвалҳои мавҷудаи омӯзиши мошинсозӣ бидуни вайрон кардани моделҳои мавҷуда дар асоси сутунҳои кӯҳна истифода баранд.

Намудҳои зерини тағйироти схема ҳамчун як қисми таҳаввулоти схема ҳангоми илова ё аз нав навиштани ҷадвал иҷозат дода мешаванд:

  • Илова кардани сутунҳои нав (ин сенарияи маъмултарин аст)
  • Тағир додани намудҳои додаҳо аз NullType -> ягон намуди дигар ё пешбурди ByteType -> ShortType -> IntegerType

Дигар тағйироте, ки дар таҳаввулоти схема иҷозат дода намешавад, талаб мекунад, ки схема ва маълумот тавассути илова аз нав навишта шаванд .option("overwriteSchema", "true"). Масалан, дар ҳолате, ки сутуни "Фу" аслан як адади бутун буд ва схемаи нав як навъи маълумотҳои сатрӣ буд, пас ҳамаи файлҳои Parquet(data) бояд аз нав навишта шаванд. Чунин тағйирот дар бар мегиранд:

  • нест кардани сутун
  • тағир додани намуди маълумоти сутуни мавҷуда (дар ҷои)
  • тағир додани номи сутунҳо, ки танҳо дар сурати фарқ мекунанд (масалан, "Foo" ва "foo")

Ниҳоят, бо нашри навбатии Spark 3.0, DDL-и возеҳ пурра дастгирӣ карда мешавад (бо истифода аз ALTER TABLE), ки ба корбарон имкон медиҳад, ки амалҳои зеринро дар схемаҳои ҷадвал иҷро кунанд:

  • илова кардани сутунҳо
  • тағир додани шарҳҳои сутун
  • танзими хосиятҳои ҷадвал, ки рафтори ҷадвалро назорат мекунанд, ба монанди муқаррар кардани дарозии вақти нигоҳ доштани сабти транзаксия.

Эволютсияи схема чӣ фоида дорад?

Эволютсияи схема метавонад ҳар вақт истифода шавад ният доранд схемаи ҷадвали худро тағир диҳед (бар хилофи вақте ки шумо тасодуфан сутунҳоро ба DataFrame-и худ илова кардаед, ки набояд дар он ҷо бошанд). Ин роҳи осонтарини интиқоли схемаи шумост, зеро он ба таври худкор номҳои дурусти сутунҳо ва намудҳои маълумотро бе эълони ошкоро илова мекунад.

хулоса

Иҷрои схема ҳама гуна сутунҳои нав ё дигар тағйироти схемаро, ки бо ҷадвали шумо мувофиқ нестанд, рад мекунад. Бо гузоштан ва нигоҳ доштани ин стандартҳои баланд, таҳлилгарон ва муҳандисон метавонанд боварӣ дошта бошанд, ки маълумоти онҳо сатҳи баландтарини беайбӣ доранд ва онро ба таври возеҳ ва равшан ирсол мекунанд ва ба онҳо имкон медиҳанд, ки қарорҳои беҳтари тиҷоратӣ қабул кунанд.

Аз тарафи дигар, эволютсияи схема иҷроишро тавассути соддагардонӣ пурра мекунад иддао кардааст тағир додани схемаи автоматӣ. Охир, илова кардани сутун набояд душвор бошад.

Татбиқи маҷбурии схема ян аст, ки дар он таҳаввулоти схема yin аст. Ҳангоми якҷоя истифода бурдан, ин хусусиятҳо фурўши садо ва танзими сигналро аз ҳарвақта осонтар мекунанд.

Мо инчунин мехостем ба Мукул Мурти ва Пранав Ананд барои саҳмашон дар ин мақола ташаккур гӯем.

Мақолаҳои дигар дар ин силсила:

Ба кӯли Делта ғарқ шавед: Гузаронидани сабти транзаксия

Мақолаҳои марбута

Омӯзиши мошини дараҷаи истеҳсолӣ бо Делта Лейк

Кӯли маълумот чист?

Дар бораи курс маълумоти бештар гиред

Манбаъ: will.com

Илова Эзоҳ