Апусканне ў Delta Lake: прымусовае прымяненне і эвалюцыя схемы

Прывітанне, Хабр! Уяўляю вашай увазе пераклад артыкула "Diving Into Delta Lake: Schema Enforcement & Evolution" аўтараў Burak Yavuz, Brenner Heintz and Denny Lee, які быў падрыхтаваны напярэдадні старту курса "Data Engineer" ад OTUS.

Апусканне ў Delta Lake: прымусовае прымяненне і эвалюцыя схемы

Дадзеныя, як і наш досвед, увесь час назапашваюцца і развіваюцца. Каб не адставаць, нашы ментальныя мадэлі свету павінны адаптавацца да новых дадзеных, некаторыя з якіх змяшчаюць новыя вымярэнні - новыя спосабы назіраць рэчы, пра якія раней мы не мелі ўяўлення. Гэтыя ментальныя мадэлі мала чым адрозніваюцца ад схем табліц, якія вызначаюць, як мы класіфікуем і апрацоўваем новую інфармацыю.

Гэта падводзіць нас да пытання кіравання схемамі. Па меры таго, як бізнес задачы і патрабаванні мяняюцца з часам, змяняецца і структура вашых дадзеных. Delta Lake дазваляе лёгка ўкараняць новыя вымярэнні пры змене дадзеных. Карыстальнікі маюць доступ да простай семантыцы для кіравання схемамі сваіх табліц. Гэтыя прылады ўключаюць прымусовае ўжыванне схемы (Schema Enforcement), якое абараняе карыстачоў ад ненаўмыснага засмечвання сваіх табліц памылкамі ці непатрэбнымі дадзенымі, а таксама эвалюцыю схемы (Schema Evolution), якая дазваляе аўтаматычна дадаваць новыя слупкі з каштоўнымі дадзенымі ў адпаведныя месцы. У гэтым артыкуле мы паглыбімся ў выкарыстанне гэтых інструментаў.

Разуменне схем табліц

Кожны DataFrame у Apache Spark змяшчае схему, якая вызначае форму дадзеных, такую ​​як тыпы дадзеных, слупкі і метададзеныя. З дапамогай Delta Lake схема табліцы захоўваецца ў фармаце JSON усярэдзіне часопіса транзакцый.

Што такое прымусовае прымяненне схемы?

Прымусовае ўжыванне схемы (Schema Enforcement), таксама вядомае як праверка схемы (Schema Validation), з'яўляецца ахоўным механізмам у Delta Lake, які гарантуе якасць дадзеных, адхіляючы запісы, якія не адпавядаюць схеме табліцы. Як і хостэс на стойцы рэгістрацыі ў папулярным рэстаране, які прымае толькі па папярэдняй броні, ён правярае, ці ёсць кожны слупок дадзеных, якія ўводзяцца ў табліцу, у адпаведным спісе чаканых слупкоў (іншымі словамі, ці ёсць для кожнага з іх «бронь»), і адхіляе любыя запісы са слупкамі, якіх няма ў спісе.

Як працуе прымусовае прымяненне схемы?

Delta Lake выкарыстоўвае праверку схемы пры запісе, што азначае, што ўсе новыя запісы ў табліцу правяраюцца на сумяшчальнасць са схемай мэтавай табліцы падчас запісу. Калі схема несумяшчальная, Delta Lake цалкам адмяняе транзакцыю (дадзеныя не запісваюцца) і стварае выключэнне, каб паведаміць карыстачу аб неадпаведнасці.
Для вызначэння сумяшчальнасці запісу з табліцай Delta Lake выкарыстоўвае наступныя правілы. Запісваны DataFrame:

  • не можа змяшчаць дадатковыя слупкі, якіх няма ў схеме мэтавай табліцы. І наадварот, усё ў парадку, калі ўваходныя дадзеныя не ўтрымоўваюць абсалютна ўсе слупкі з табліцы - гэтым слупкам проста будуць прысвоены нулявыя значэнні.
  • не можа мець тыпы дадзеных слупкоў, якія адрозніваюцца ад тыпаў дадзеных слупкоў у мэтавай табліцы. Калі слупок мэтавай табліцы ўтрымоўвае дадзеныя StringType, але які адпавядае слупок у DataFrame утрымоўвае дадзеныя IntegerType, прымусовае ўжыванне схемы выкліча выключэнне і прадухіліць выкананне аперацыі запісу.
  • не можа змяшчаць імёны слупкоў, якія адрозніваюцца толькі рэгістрам. Гэта значыць, што вы не можаце мець слупкі з імёнамі 'Foo' і 'foo', вызначаныя ў адной табліцы. Хоць Spark можна выкарыстоўваць у адчувальным ці неадчувальным (па змаўчанні) да рэгістра рэжыму, Delta Lake захоўвае рэгістр, але неадчувальны ў рамках захоўванні схемы. Parquet адчувальны да рэгістра пры захоўванні і звароце інфармацыі слупка. Каб пазбегнуць магчымых памылак, пашкоджанні дадзеных ці іх страты (з чым мы асабіста сутыкаліся ў Databricks), мы вырашылі дадаць гэтае абмежаванне.

Каб праілюстраваць гэта, давайце зірнем на тое, што адбываецца ў прыведзеным ніжэй кодзе пры спробе дадаць некаторыя нядаўна згенераваныя слупкі ў табліцу Delta Lake, якая яшчэ не настроена для іх прыняцця.

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

Замест аўтаматычнага дадання новых слупкоў, Delta Lake навязвае схему і спыняе запіс. Каб дапамагчы вызначыць які слупок (ці іх мноства) з'яўляецца прычынай неадпаведнасці, Spark выводзіць абедзве схемы са стэк трэйса для параўнання.

У чым карысць прымусовага прымянення схемы?

Паколькі прымусовае ўжыванне схемы ўяўляе з сябе досыць строгую праверку, яно з'яўляецца выдатнай прыладай для выкарыстання ў якасці брамніка чыстага, цалкам пераўтворанага набору дадзеных, які готаў да вытворчасці або спажыванню. Як правіла, прымяняецца да табліц, якія непасрэдна падаюць дадзеныя:

  • Алгарытмам машыннага навучання
  • BI дашбордам
  • Аналітыцы дадзеных і інструментам візуалізацыі
  • Любы вытворчай сістэме, якая патрабуе строга структураваных, строга тыпізаваных семантычных схем.

Каб падрыхтаваць свае дадзеныя да гэтага фінальнага бар'ера, шматлікія карыстачы выкарыстоўваюць простую "multi-hop" архітэктуру, якая паступова ўносіць структуру ў іх табліцы. Каб даведацца пра гэта больш, вы можаце азнаёміцца ​​з артыкулам Машыннае навучанне вытворчага ўзроўню з Delta Lake.

Вядома, прымусовае ўжыванне схемы можна выкарыстоўваць у любым месцы вашага пайплайна, але памятаеце, што струменевы запіс у табліцу ў такім выпадку можа быць фрустрыруючай, з-за таго што, напрыклад, вы забыліся, што дадалі яшчэ адзін слупок ва ўваходныя дадзеныя.

Прадухіленне разрэджвання дадзеных

Да гэтага моманту вы можаце задацца пытаннем, з-за чаго такі ажыятаж? У рэшце рэшт, часам нечаканая памылка "неадпаведнасці схемы" можа падставіць вам падножку ў вашым працоўным працэсе, асабліва калі вы пачатковец у Delta Lake. Чаму б проста не дазволіць схеме змяніцца так, як трэба для таго, каб я мог запісаць свой DataFrame, нягледзячы ні на што?

Як абвяшчае старая прымаўка, «ўнцыя прафілактыкі варта фунта лячэння». У нейкі момант, калі вы не паклапоціцеся аб ужыванні сваёй схемы, паднімуць свае агідныя галовы праблемы з сумяшчальнасцю тыпаў дадзеных - на першы погляд аднастайныя крыніцы неапрацаваных дадзеных могуць утрымоўваць памежныя выпадкі, пашкоджаныя слупкі, няправільна сфармаваныя адлюстраванні ці іншыя страшныя рэчы, якія сняцца у кашмарах. Лепшы падыход складаецца ў тым, каб спыняць гэтых ворагаў у варот - з дапамогай прымусовага прымянення схемы - і мець справу з імі на святла, а не пазней, калі яны пачнуць гойсаць у цёмных глыбінях вашага працоўнага кода.

Прымусовае ўжыванне схемы дае ўпэўненасць у тым, што схема вашай табліцы не зменіцца, калі толькі вы самі не пацвердзіце варыянт змены. Гэта прадухіляе "разрэджванне" (dilution) дадзеных, якое можа адбывацца, калі новыя слупкі дадаюцца так часта, што раней каштоўныя, сціснутыя табліцы губляюць сваё значэнне і карыснасць з-за паводкі дадзенымі. Заахвочваючы вас быць наўмысным, усталёўваць высокія стандарты і чакаць высокай якасці, прымусовае ўжыванне схемы робіць менавіта тое, для чаго было прызначана - дапамагаць вам заставацца добрасумленнымі, а вашым табліцам - чыстымі.

Калі пры далейшым разглядзе вы вырашыце, што вам на самой справе трэба дадаць новы слупок - ніякіх праблем, ніжэй прыведзены аднарадковы фікс. Рашэнне - эвалюцыя схемы!

Што такое эвалюцыя схемы?

Эвалюцыя схемы - гэта функцыя, якая дазваляе карыстальнікам лёгка змяняць бягучую схему табліцы ў адпаведнасці з дадзенымі, якія мяняюцца з цягам часу. Часцей за ўсё яна выкарыстоўваецца пры выкананні аперацыі дадання ці перазапісы, каб аўтаматычна адаптаваць схему для ўключэння аднаго ці некалькіх новых слупкоў.

Як працуе эвалюцыя схемы?

Прытрымліваючыся прыкладу з папярэдняй часткі, распрацоўнікі могуць лёгка выкарыстоўваць эвалюцыю схемы для дадання новых слупкоў, якія раней былі адхіленыя з-за неадпаведнасці схеме. Эвалюцыя схемы актывуецца шляхам дадання .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

Апусканне ў Delta Lake: прымусовае прымяненне і эвалюцыя схемы
У якасці альтэрнатывы, вы можаце ўсталяваць гэтую опцыю для ўсёй сесіі Spark, дадаўшы spark.databricks.delta.schema.autoMerge = True у канфігурацыю Spark. Але карыстайцеся гэтым з асцярожнасцю, паколькі прымусовае прымяненне схемы больш не будзе папярэджваць вас аб ненаўмысных неадпаведнасцях схеме.

Улучыўшы ў запыт параметр mergeSchema, усе слупкі, якія прысутнічаюць у DataFrame, але адсутнічаюць у мэтавай табліцы, аўтаматычна дадаюцца ў канец схемы ў рамках транзакцыі запісу. Таксама могуць быць дададзены ўкладзеныя палі, і яны таксама будуць дададзены ў канец адпаведных слупкоў структуры.

Дата інжынеры і навукоўцы могуць выкарыстоўваць гэтую опцыю, каб дадаць новыя слупкі (магчыма, нядаўна адсочваную метрыку або слупок паказчыкаў продажаў у гэтым месяцы) у свае існуючыя вытворчыя табліцы машыннага навучання, не парушаючы існуючыя мадэлі, заснаваныя на старых слупках.

Наступныя тыпы змен схемы дапушчальныя ў рамках эвалюцыю схемы падчас дадання ці перазапісу табліцы:

  • Даданне новых слупкоў (гэта найболей распаўсюджаны сцэнар)
  • Змена тыпаў дадзеных з NullType -> любы іншы тып або павышэнне з ByteType -> ShortType -> IntegerType

Іншыя змены, недапушчальныя ў рамках эвалюцыі схемы, патрабуюць, каб схема і дадзеныя былі перазапісаны шляхам дадання .option("overwriteSchema", "true"). Напрыклад, у выпадку, калі слупок "Foo" першапачаткова быў integer, а новая схема была б радковага тыпу дадзеных, тады ўсе файлы Parquet (data) неабходна было б перазапісаць. Да такіх змен адносяцца:

  • выдаленне слупка
  • змена тыпу дадзеных існуючага слупка (на месцы)
  • перайменаванне слупкоў, якія адрозніваюцца толькі рэгістрам (напрыклад, "Foo" і "foo")

Нарэшце, з наступным рэлізам Spark 3.0 будзе цалкам падтрымлівацца відавочны DDL (з выкарыстаннем ALTER TABLE), што дазволіць карыстачам выконваць наступныя дзеянні над схемамі табліц:

  • даданне слупкоў
  • змена каментароў да слупкоў
  • настройка ўласцівасцей табліцы, якія вызначаюць паводзіны табліцы, напрыклад, устаноўка працягласці захоўвання часопіса транзакцый.

У чым карысць эвалюцыя схемы?

Эвалюцыю схемы можна выкарыстоўваць заўсёды, калі вы намерваецеся змяніць схему сваёй табліцы (у процівагу тым выпадкам, калі вы выпадкова дадалі ў свой DataFrame слупкі, якіх тамака быць не павінна). Гэта самы просты спосаб міграваць вашу схему, таму што ён аўтаматычна дадае правільныя імёны слупкоў і тыпы дадзеных без неабходнасці іх відавочнай аб'явы.

Заключэнне

Прымусовае прымяненне схемы адхіляе любыя новыя слупкі ці іншыя змены схемы, якія не сумяшчальныя з вашай табліцай. Усталёўваючы і падтрымліваючы гэтыя высокія стандарты, аналітыкі і інжынеры могуць спадзявацца на тое, што іх дадзеныя маюць найвышэйшы ўзровень цэласнасці, разважаючы пра гэта дакладна і ясна, што дазваляе ім прымаць больш эфектыўныя бізнес-рашэнні.

З іншага боку, эвалюцыя схемы дапаўняе прымусовае ўжыванне, спрашчаючы меркаваныя аўтаматычныя змен схемы. У рэшце рэшт, гэта не павінна быць складанасцю - дадаць слупок.

Прымусовае прымяненне схемы - гэта янь, дзе эвалюцыі схемы - гэта інь. Пры сумесным выкарыстанні гэтыя функцыі як ніколі спрашчаюць прыгнечанне шуму і наладу сігналу.

Мы таксама хацелі б падзякаваць Мукула Мурці і Пранава Ананда за іх уклад у гэты артыкул.

Іншыя артыкулы з гэтай серыі:

Апусканне ў Delta Lake: распакаванне часопіса транзакцый

Артыкулы па тэме

Машыннае навучанне вытворчага ўзроўню з Delta Lake

Што такое возера даных?

Даведацца аб курсе падрабязней

Крыніца: habr.com

Дадаць каментар