Deifiwch i Lyn Delta: Gorfodi Sgema ac Esblygiad

Hei Habr! Cyflwynaf i'ch sylw gyfieithiad yr erthygl "Plymio i Lyn Delta: Gorfodi Sgema ac Esblygiad" yr awduron Burak Yavuz, Brenner Heintz a Denny Lee, a baratowyd gan ragweld dechrau'r cwrs Peiriannydd Data oddi wrth OTUS.

Deifiwch i Lyn Delta: Gorfodi Sgema ac Esblygiad

Mae data, fel ein profiad ni, yn cronni ac yn esblygu'n gyson. I gadw i fyny, mae'n rhaid i'n modelau meddyliol o'r byd addasu i ddata newydd, y mae rhai ohonynt yn cynnwys dimensiynau newydd - ffyrdd newydd o arsylwi pethau nad oedd gennym unrhyw syniad amdanynt o'r blaen. Nid yw'r modelau meddwl hyn yn llawer gwahanol i'r sgemâu tabl sy'n pennu sut rydym yn categoreiddio a phrosesu gwybodaeth newydd.

Daw hyn â ni at fater rheoli sgema. Wrth i heriau a gofynion busnes newid dros amser, felly hefyd strwythur eich data. Mae Delta Lake yn ei gwneud hi'n hawdd cyflwyno mesuriadau newydd wrth i ddata newid. Mae gan ddefnyddwyr fynediad at semanteg syml i reoli eu sgemâu bwrdd. Mae'r offer hyn yn cynnwys Gorfodi Sgema, sy'n amddiffyn defnyddwyr rhag llygru eu tablau yn anfwriadol â gwallau neu ddata diangen, a Schema Evolution, sy'n caniatáu ychwanegu colofnau newydd o ddata gwerthfawr yn awtomatig i'r lleoliadau priodol. Yn yr erthygl hon, byddwn yn plymio'n ddyfnach i ddefnyddio'r offer hyn.

Deall Sgemâu Tabl

Mae pob DataFrame yn Apache Spark yn cynnwys sgema sy'n diffinio ffurf y data, megis mathau o ddata, colofnau, a metadata. Gyda Delta Lake, mae'r sgema bwrdd yn cael ei storio ar ffurf JSON y tu mewn i'r log trafodion.

Beth yw gorfodi'r cynllun?

Mae Gorfodi Sgema, a elwir hefyd yn Ddilysiad Sgema, yn fecanwaith diogelwch yn Llyn Delta sy'n sicrhau ansawdd data trwy wrthod cofnodion nad ydynt yn cyd-fynd â sgema'r tabl. Fel y gwesteiwr ar ddesg flaen bwyty poblogaidd sydd wedi'i neilltuo'n unig, mae hi'n gwirio a yw pob colofn o ddata a roddir yn y tabl yn y rhestr gyfatebol o golofnau disgwyliedig (mewn geiriau eraill, a oes "archeb" ar gyfer pob un ohonynt ), ac yn gwrthod unrhyw gofnodion gyda cholofnau nad ydynt yn y rhestr.

Sut mae gorfodi sgema yn gweithio?

Mae Delta Lake yn defnyddio gwirio sgema-ar-ysgrifen, sy'n golygu bod pob ysgrifen newydd i'r tabl yn cael ei wirio i weld a yw'n gydnaws â sgema'r tabl targed ar amser ysgrifennu. Os yw'r sgema yn anghyson, mae Delta Lake yn erthylu'r trafodiad yn gyfan gwbl (nid oes unrhyw ddata wedi'i ysgrifennu) ac yn codi eithriad i hysbysu'r defnyddiwr o'r anghysondeb.
Mae Delta Lake yn defnyddio'r rheolau canlynol i benderfynu a yw cofnod yn gydnaws â thabl. Ffrâm Data y gellir ei Ysgrifennu:

  • Ni all gynnwys colofnau ychwanegol nad ydynt yn sgema'r tabl targed. I'r gwrthwyneb, mae popeth yn iawn os nad yw'r data sy'n dod i mewn yn cynnwys yr holl golofnau o'r tabl yn gyfan gwbl - yn syml, bydd y colofnau hyn yn cael eu neilltuo gwerthoedd nwl.
  • Ni all gael mathau o ddata colofn sy'n wahanol i fathau data'r colofnau yn y tabl targed. Os yw colofn y tabl targed yn cynnwys data StringType, ond mae'r golofn gyfatebol yn y DataFrame yn cynnwys data IntegerType, bydd gorfodi sgema yn taflu eithriad ac yn atal y gweithrediad ysgrifennu rhag digwydd.
  • Ni all gynnwys enwau colofnau sy'n wahanol yn unig rhag ofn. Mae hyn yn golygu na allwch gael colofnau o'r enw 'Foo' a 'foo' wedi'u diffinio yn yr un tabl. Er y gellir defnyddio Spark mewn modd sy'n sensitif i achos neu achos-ansensitif (diofyn), mae Delta Lake yn cadw achosion ond mae'n ansensitif yn y storfa sgema. Mae parquet yn hynod sensitif wrth storio a dychwelyd gwybodaeth colofn. Er mwyn osgoi gwallau posibl, llygredd data, neu golli data (rhywbeth a brofwyd gennym yn bersonol yn Databricks), penderfynasom ychwanegu'r cyfyngiad hwn.

I ddangos hyn, gadewch i ni edrych ar yr hyn sy'n digwydd yn y cod isod pan geisiwn ychwanegu rhai colofnau sydd newydd eu cynhyrchu at dabl Delta Lake nad yw wedi'i ffurfweddu eto i'w derbyn.

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

Yn lle ychwanegu colofnau newydd yn awtomatig, mae Delta Lake yn gosod sgema ac yn stopio ysgrifennu. Er mwyn helpu i benderfynu pa golofn (neu set o golofnau) sy'n achosi'r anghysondeb, mae Spark yn allbynnu'r ddau sgema o olrhain y pentwr i'w cymharu.

Beth yw manteision gorfodi sgema?

Gan fod gorfodi sgema yn wiriad eithaf llym, mae'n arf ardderchog i'w ddefnyddio fel porthor i set ddata lân, wedi'i thrawsnewid yn llawn sy'n barod i'w chynhyrchu neu ei defnyddio. Cymhwysir yn nodweddiadol i dablau sy'n bwydo data yn uniongyrchol:

  • Algorithmau dysgu peiriant
  • dangosfyrddau BI
  • Offer dadansoddi data a delweddu
  • Unrhyw system gynhyrchu sy'n gofyn am sgemâu semantig strwythuredig iawn, wedi'u teipio'n gryf.

I baratoi eu data ar gyfer y rhwystr olaf hwn, mae llawer o ddefnyddwyr yn defnyddio pensaernïaeth “aml-hop” syml sy'n cyflwyno strwythur yn raddol i'w tablau. I ddysgu mwy am hyn, gallwch edrych ar yr erthygl Dysgu peiriant gradd cynhyrchu gyda Delta Lake.

Wrth gwrs, gellir defnyddio gorfodi sgema yn unrhyw le ar y gweill, ond cofiwch y gall ffrydio i fwrdd yn yr achos hwn fod yn rhwystredig oherwydd, er enghraifft, fe wnaethoch chi anghofio eich bod wedi ychwanegu colofn arall at y data sy'n dod i mewn.

Atal gwanhau data

Erbyn hyn efallai eich bod yn pendroni, beth yw'r ffwdan i gyd yn ei gylch? Wedi'r cyfan, weithiau gall gwall "diffyg cyfatebiaeth sgema" annisgwyl eich baglu yn eich llif gwaith, yn enwedig os ydych chi'n newydd i Delta Lake. Beth am adael i'r sgema newid yn ôl yr angen fel y gallaf ysgrifennu fy DataFrame beth bynnag?

Fel y dywed yr hen ddywediad, “mae owns o atal yn werth punt o wellhad.” Ar ryw adeg, os na fyddwch yn cymryd gofal i orfodi'ch sgema, bydd materion cydnawsedd math o ddata yn magu eu pennau hyll - gall ffynonellau data crai sy'n ymddangos yn homogenaidd gynnwys casys ymyl, colofnau llygredig, mapiau wedi'u camffurfio, neu bethau brawychus eraill i freuddwydio amdanynt. hunllefau. Y dull gorau yw atal y gelynion hyn wrth y giât - gyda gorfodi sgema - a delio â nhw yn y golau, yn hytrach nag yn hwyrach pan fyddant yn dechrau llechu yn nyfnder tywyll eich cod cynhyrchu.

Mae gorfodi sgema yn rhoi sicrwydd i chi na fydd sgema eich bwrdd yn newid oni bai eich bod yn cymeradwyo'r newid. Mae hyn yn atal gwanhau data, a all ddigwydd pan fydd colofnau newydd yn cael eu hychwanegu mor aml fel bod tablau cywasgedig a oedd yn werthfawr yn flaenorol yn colli eu hystyr a'u defnyddioldeb oherwydd gorlif data. Trwy eich annog i fod yn fwriadol, gosod safonau uchel, a disgwyl ansawdd uchel, mae gorfodi sgema yn gwneud yn union yr hyn y cafodd ei gynllunio i'w wneud - eich helpu i aros yn gydwybodol a'ch taenlenni'n lân.

Os penderfynwch ar ôl ystyried ymhellach eich bod chi mewn gwirionedd i ychwanegu colofn newydd - dim problem, isod mae ateb un llinell. Yr ateb yw esblygiad y gylched!

Beth yw esblygiad sgema?

Mae esblygiad sgema yn nodwedd sy'n caniatáu i ddefnyddwyr newid y sgema tabl cyfredol yn hawdd yn ôl data sy'n newid dros amser. Fe'i defnyddir amlaf wrth berfformio gweithrediad atodiad neu ailysgrifennu i addasu'r sgema yn awtomatig i gynnwys un neu fwy o golofnau newydd.

Sut mae esblygiad sgema yn gweithio?

Yn dilyn yr enghraifft o'r adran flaenorol, gall datblygwyr ddefnyddio esblygiad sgema yn hawdd i ychwanegu colofnau newydd a wrthodwyd yn flaenorol oherwydd anghysondeb sgema. Mae esblygiad cylched yn cael ei actifadu trwy ychwanegu .option('mergeSchema', 'true') i'ch tîm Spark .write или .writeStream.

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

I weld y graff, rhedwch yr ymholiad Spark SQL canlynol

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

Deifiwch i Lyn Delta: Gorfodi Sgema ac Esblygiad
Fel arall, gallwch chi osod yr opsiwn hwn ar gyfer y sesiwn Spark gyfan trwy ychwanegu spark.databricks.delta.schema.autoMerge = True i gyfluniad Spark. Ond defnyddiwch hwn yn ofalus, gan na fydd gorfodi sgema bellach yn eich rhybuddio am anghysondebau anfwriadol yn y sgema.

Trwy gynnwys y paramedr yn y cais mergeSchema, mae'r holl golofnau sy'n bresennol yn y DataFrame ond nid yn y tabl targed yn cael eu hychwanegu'n awtomatig at ddiwedd y sgema fel rhan o drafodiad ysgrifennu. Gellir ychwanegu meysydd nythu hefyd a bydd y rhain hefyd yn cael eu hychwanegu at ddiwedd y colofnau strwythur cyfatebol.

Gall peirianwyr dyddiad a gwyddonwyr data ddefnyddio'r opsiwn hwn i ychwanegu colofnau newydd (efallai metrig a draciwyd yn ddiweddar neu golofn perfformiad gwerthiant y mis hwn) i'w tablau cynhyrchu dysgu peiriannau presennol heb dorri modelau presennol yn seiliedig ar hen golofnau.

Caniateir y mathau canlynol o newidiadau sgema fel rhan o esblygiad sgema wrth ychwanegu tabl neu ailysgrifennu:

  • Ychwanegu colofnau newydd (dyma'r senario mwyaf cyffredin)
  • Newid mathau o ddata o NullType -> unrhyw fath arall neu hyrwyddo o ByteType -> ShortType -> IntegerType

Mae newidiadau eraill nas caniateir o fewn esblygiad sgema yn gofyn am ailysgrifennu'r sgema a'r data trwy ychwanegu .option("overwriteSchema", "true"). Er enghraifft, yn yr achos lle'r oedd y golofn "Foo" yn gyfanrif yn wreiddiol a bod y sgema newydd yn fath o ddata llinynnol, yna byddai angen ailysgrifennu'r holl ffeiliau Parquet (data). Mae newidiadau o’r fath yn cynnwys:

  • dileu colofn
  • newid math data colofn sy'n bodoli (yn ei lle)
  • ailenwi colofnau sy'n wahanol yn unig rhag ofn (er enghraifft, "Foo" a "foo")

Yn olaf, gyda datganiad nesaf Spark 3.0, bydd DDL penodol yn cael ei gefnogi'n llawn (gan ddefnyddio ALTER TABLE), gan ganiatáu i ddefnyddwyr gyflawni'r gweithredoedd canlynol ar sgemâu bwrdd:

  • ychwanegu colofnau
  • newid sylwadau colofn
  • gosod priodweddau tabl sy'n rheoli ymddygiad y bwrdd, megis gosod hyd yr amser y mae log trafodion yn cael ei storio.

Beth yw manteision esblygiad cylched?

Gellir defnyddio esblygiad sgema pryd bynnag y byddwch bwriadu newid sgema eich bwrdd (yn hytrach na phan wnaethoch chi ychwanegu colofnau at eich DataFrame yn ddamweiniol na ddylai fod yno). Dyma'r ffordd hawsaf i fudo'ch sgema oherwydd ei fod yn ychwanegu'r enwau colofnau a'r mathau o ddata cywir yn awtomatig heb orfod eu datgan yn benodol.

Casgliad

Mae gorfodi sgema yn gwrthod unrhyw golofnau newydd neu newidiadau sgema eraill nad ydynt yn gydnaws â'ch tabl. Trwy osod a chynnal y safonau uchel hyn, gall dadansoddwyr a pheirianwyr ymddiried bod gan eu data'r lefel uchaf o gywirdeb, gan ei gyfathrebu'n glir ac yn glir, gan ganiatáu iddynt wneud gwell penderfyniadau busnes.

Ar y llaw arall, mae esblygiad sgema yn ategu gorfodi trwy symleiddio honedig newidiadau sgema awtomatig. Wedi'r cyfan, ni ddylai fod yn anodd ychwanegu colofn.

Cymhwysiad gorfodol y cynllun yw yang, lle mae esblygiad y cynllun yn yin. O'u defnyddio gyda'i gilydd, mae'r nodweddion hyn yn gwneud atal sŵn a thiwnio signal yn haws nag erioed.

Hoffem hefyd ddiolch i Mukul Murthy a Pranav Anand am eu cyfraniadau i'r erthygl hon.

Erthyglau eraill yn y gyfres hon:

Deifiwch i Lyn Delta: Dadbacio'r Log Trafodion

Erthyglau Perthnasol

Dysgu peiriant gradd cynhyrchu gyda Delta Lake

Beth yw llyn data?

Darganfod mwy am y cwrs

Ffynhonnell: hab.com

Ychwanegu sylw