Plonĝu en Deltan Lago: Skemo-Devigo kaj Evoluo

Hej Habr! Mi prezentas al via atento la tradukon de la artikolo "Plonĝado en Deltan Lago: Schema Devigo & Evoluo" aŭtoroj Burak Yavuz, Brenner Heintz kaj Denny Lee, kiu estis preparita antaŭ la komenco de la kurso Datuma Inĝeniero de OTUS.

Plonĝu en Deltan Lago: Skemo-Devigo kaj Evoluo

Datumoj, kiel nia sperto, konstante amasiĝas kaj evoluas. Por daŭrigi, niaj mensaj modeloj de la mondo devas adaptiĝi al novaj datumoj, iuj el kiuj enhavas novajn dimensiojn—novajn manierojn observi aferojn, pri kiuj ni antaŭe ne havis ideon. Ĉi tiuj mensaj modeloj ne multe diferencas de la tabelskemoj, kiuj determinas kiel ni kategoriigas kaj prilaboras novajn informojn.

Ĉi tio alportas nin al la temo de skemadministrado. Ĉar komercaj defioj kaj postuloj ŝanĝiĝas laŭlonge de la tempo, ankaŭ la strukturo de viaj datumoj ŝanĝas. Delta Lago faciligas enkonduki novajn mezuradojn kiam datumoj ŝanĝiĝas. Uzantoj havas aliron al simpla semantiko por administri siajn tabelajn skemojn. Ĉi tiuj iloj inkluzivas Schema Enforcement, kiu protektas uzantojn kontraŭ neintence poluado de siaj tabeloj per eraroj aŭ nenecesaj datumoj, kaj Schema Evolution, kiu permesas aŭtomate aldoni novajn kolumnojn de valoraj datumoj al la taŭgaj lokoj. En ĉi tiu artikolo, ni pliprofundiĝos pri uzado de ĉi tiuj iloj.

Kompreni Tabelajn Skemojn

Ĉiu DataFrame en Apache Spark enhavas skemon, kiu difinas la formon de la datumoj, kiel datumtipoj, kolumnoj kaj metadatenoj. Kun Delta Lake, la tabelskemo estas konservita en JSON-formato ene de la transakcia protokolo.

Kio estas skemo-devigo?

Schema Enforcement, ankaŭ konata kiel Schema Validation, estas sekureca mekanismo en Delta Lago kiu certigas datumkvaliton malakceptante rekordojn kiuj ne kongruas kun la skemo de la tabelo. Kiel la gastigantino ĉe la ricevo de populara nur rezerva restoracio, ŝi kontrolas ĉu ĉiu kolumno de datumoj enigitaj en la tabelon estas en la responda listo de atendataj kolumnoj (alivorte, ĉu estas "rezervo" por ĉiu el ili. ), kaj malakceptas iujn ajn rekordojn kun kolumnoj kiuj ne estas en la listo.

Kiel funkcias skemo-devigo?

Delta Lago uzas kontrolon de skemo-sur-skribo, kio signifas, ke ĉiuj novaj skribaĵoj al la tabelo estas kontrolitaj por kongruo kun la skemo de la celtabelo en skriba tempo. Se la skemo estas malkonsekvenca, Delta Lake tute nuligas la transakcion (neniu datumoj estas skribitaj) kaj levas escepton por sciigi la uzanton pri la nekonsekvenco.
Delta Lago uzas la sekvajn regulojn por determini ĉu rekordo estas kongrua kun tabelo. Skribebla DataFrame:

  • ne povas enhavi pliajn kolumnojn kiuj ne estas en la skemo de la celtabelo. Male, ĉio estas en ordo se la envenantaj datumoj ne enhavas absolute ĉiujn kolumnojn de la tabelo - ĉi tiuj kolumnoj simple estos asignitaj nulaj valoroj.
  • ne povas havi kolumnajn datumtipojn kiuj diferencas de la datumtipoj de la kolumnoj en la cela tabelo. Se la celtabelkolumno enhavas StringType-datumojn, sed la responda kolumno en la DataFrame enhavas IntegerType-datumojn, skemo-devigo ĵetos escepton kaj malhelpos la skriban operacion okazi.
  • ne povas enhavi kolonnomojn kiuj malsamas nur en kazo. Ĉi tio signifas, ke vi ne povas havi kolumnojn nomitajn 'Foo' kaj 'foo' difinitaj en la sama tabelo. Dum Spark povas esti uzata en majusksentema aŭ uskleksentema (defaŭlta) reĝimo, Delta Lake konservas usklekon sed estas malsentema ene de la skemstokado. Parketo distingas minusklecon dum stokado kaj resendo de kolumnformoj. Por eviti eblajn erarojn, korupton de datumoj aŭ perdon de datumoj (io, kion ni persone spertis ĉe Databricks), ni decidis aldoni ĉi tiun limigon.

Por ilustri ĉi tion, ni rigardu, kio okazas en la kodo sube, kiam ni provas aldoni kelkajn novgeneritajn kolumnojn al tablo Delta Lake kiu ankoraŭ ne estas agordita por akcepti ilin.

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

Anstataŭ aŭtomate aldoni novajn kolumnojn, Delta Lake trudas skemon kaj ĉesas skribi. Por helpi determini kiu kolumno (aŭ aro de kolumnoj) kaŭzas la diferencon, Spark eligas ambaŭ skemojn el la stakspuro por komparo.

Kio estas la avantaĝo de devigi skemon?

Ĉar skemdevigo estas sufiĉe strikta kontrolo, ĝi estas bonega ilo por uzi kiel pordegogardisto al pura, plene transformita datumaro, kiu estas preta por produktado aŭ konsumo. Tipe aplikata al tabeloj, kiuj rekte nutras datumojn:

  • Algoritmoj de lernado de maŝinoj
  • BI paneloj
  • Datum-analitiko kaj bildigaj iloj
  • Ajna produktadsistemo kiu postulas tre strukturitajn, forte tajpitajn semantikajn skemojn.

Por prepari siajn datumojn por ĉi tiu fina obstaklo, multaj uzantoj uzas simplan "multi-saltecan" arkitekturon, kiu iom post iom enkondukas strukturon en siajn tabelojn. Por lerni pli pri tio, vi povas kontroli la artikolon Produktadnivela maŝinlernado kun Delta Lake.

Kompreneble, skemo-devigo povas esti uzata ie ajn en via dukto, sed memoru, ke fluado al tablo en ĉi tiu kazo povas esti frustranta ĉar, ekzemple, vi forgesis, ke vi aldonis alian kolumnon al la envenantaj datumoj.

Malhelpante diluadon de datumoj

Nun vi eble demandos, pri kio temas la tuta tumulto? Post ĉio, foje neatendita "skema miskongruo" eraro povas stumbli vin en via laborfluo, precipe se vi estas nova en Delta Lago. Kial ne simple lasu la skemon ŝanĝi laŭbezone por ke mi povu skribi mian DataFrame kiom ajn?

Kiel diras la malnova diro, "unco da prevento valoras funton da kuraco." Iam, se vi ne zorgas plenumi vian skemon, problemoj pri kongruo de datumtipoj malbeligos siajn malbelajn kapojn - ŝajne homogenaj krudaj datumfontoj povas enhavi randajn kazojn, koruptitajn kolumnojn, misformitajn mapadojn aŭ aliajn timigajn aferojn pri kiuj sonĝi. koŝmaroj. La plej bona aliro estas haltigi ĉi tiujn malamikojn ĉe la pordego - kun skemo-devigo - kaj trakti ilin en la lumo, prefere ol poste kiam ili komencas kaŝatendi en la mallumaj profundoj de via produktkodo.

Devigi skemon donas al vi la certigon, ke la skemo de via tabelo ne ŝanĝiĝos krom se vi aprobas la ŝanĝon. Ĉi tio malhelpas datumdiluadon, kiu povas okazi kiam novaj kolumnoj estas aldonitaj tiel ofte, ke antaŭe valoraj, kunpremitaj tabeloj perdas sian signifon kaj utilecon pro datuminundo. Instigante vin esti intencita, starigi altajn normojn kaj atendi altkvalitan, skemo-devigo faras ĝuste tion, por kio ĝi estis desegnita—helpi vin resti konscienca kaj viaj kalkultabeloj puraj.

Se post plia konsidero vi decidas, ke vi vere bezonas aldonu novan kolumnon - neniu problemo, malsupre estas unulinia solvo. La solvo estas la evoluo de la cirkvito!

Kio estas skema evoluo?

Skema evoluado estas trajto, kiu permesas al uzantoj facile ŝanĝi la nunan tabelskemon laŭ datumoj, kiuj ŝanĝiĝas laŭlonge de la tempo. Ĝi estas plej ofte uzata dum plenumado de aldono aŭ reverka operacio por aŭtomate adapti la skemon por inkludi unu aŭ plurajn novajn kolumnojn.

Kiel funkcias skema evoluo?

Sekvante la ekzemplon de la antaŭa sekcio, programistoj povas facile uzi skeman evoluon por aldoni novajn kolumnojn, kiuj antaŭe estis malakceptitaj pro skemkongrueco. Cirkvita evoluo estas aktivigita per aldono .option('mergeSchema', 'true') al via Spark-teamo .write или .writeStream.

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

Por vidi la grafeon, rulu la sekvan Spark SQL-demandon

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

Plonĝu en Deltan Lago: Skemo-Devigo kaj Evoluo
Alternative, vi povas agordi ĉi tiun opcion por la tuta Spark-sesio aldonante spark.databricks.delta.schema.autoMerge = True al la Spark-agordo. Sed uzu ĉi tion singarde, ĉar skemdevigo ne plu atentigos vin pri neintencaj skemaj nekongruoj.

Inkludante la parametron en la peto mergeSchema, ĉiuj kolumnoj kiuj ĉeestas en la DataFrame sed ne en la celtabelo estas aŭtomate aldonitaj al la fino de la skemo kiel parto de skriba transakcio. Nestitaj kampoj ankaŭ povas esti aldonitaj kaj ĉi tiuj ankaŭ estos aldonitaj al la fino de la respondaj strukturkolumnoj.

Datumaj inĝenieroj kaj datumsciencistoj povas uzi ĉi tiun opcion por aldoni novajn kolumnojn (eble lastatempe spurita metriko aŭ la venda agado de ĉi tiu monato) al siaj ekzistantaj maŝinlernantaj produktadtabloj sen rompi ekzistantajn modelojn bazitajn sur malnovaj kolumnoj.

La sekvaj specoj de skemŝanĝoj estas permesitaj kiel parto de skemevoluo dum tabelaldono aŭ reverkado:

  • Aldonante novajn kolumnojn (ĉi tio estas la plej ofta scenaro)
  • Ŝanĝi datumtipojn de NullType -> ajna alia tipo aŭ promocii de ByteType -> ShortType -> IntegerType

Aliaj ŝanĝoj ne permesitaj ene de skemevolucio postulas ke la skemo kaj datenoj estu reverkitaj per aldonado .option("overwriteSchema", "true"). Ekzemple, en la kazo kie la kolumno "Foo" estis origine entjero kaj la nova skemo estis ĉena datumtipo, tiam ĉiuj Parquet (datumoj) dosieroj devus esti reverkitaj. Tiaj ŝanĝoj inkluzivas:

  • forigante kolumnon
  • ŝanĝante la datumtipo de ekzistanta kolumno (loke)
  • renomante kolumnojn kiuj malsamas nur en kazo (ekzemple, "Foo" kaj "foo")

Fine, kun la sekva eldono de Spark 3.0, eksplicita DDL estos plene subtenata (uzante ALTER TABLE), permesante al uzantoj plenumi la sekvajn agojn sur tabelaj skemoj:

  • aldonante kolumnojn
  • ŝanĝante kolumnkomentojn
  • agordi tabelajn trajtojn, kiuj kontrolas la konduton de la tabelo, kiel agordi la tempodaŭron, kiam transakcia protokolo estas stokita.

Kio estas la avantaĝo de cirkvito-evoluo?

Skema evoluo povas esti uzata kiam ajn vi intencas ŝanĝi la skemon de via tabelo (kontraste al kiam vi hazarde aldonis kolumnojn al via DataFrame kiuj ne devus esti tie). Ĉi tio estas la plej facila maniero por migri vian skemon ĉar ĝi aŭtomate aldonas la ĝustajn kolonnomojn kaj datumtipojn sen devi eksplicite deklari ilin.

konkludo

Skemo-devigo malakceptas novajn kolumnojn aŭ aliajn skemajn ŝanĝojn, kiuj ne kongruas kun via tabelo. Fiksante kaj konservante ĉi tiujn altajn normojn, analizistoj kaj inĝenieroj povas fidi, ke iliaj datumoj havas la plej altan nivelon de integreco, komunikante ĝin klare kaj klare, permesante al ili fari pli bonajn komercajn decidojn.

Aliflanke, skemevolucio kompletigas devigon per simpligado supozita aŭtomataj skemaj ŝanĝoj. Post ĉio, ne devus esti malfacile aldoni kolumnon.

La deviga aplikado de la skemo estas jango, kie la evoluo de la skemo estas jina. Se uzataj kune, ĉi tiuj funkcioj faciligas bruon kaj signal-agordon pli facile ol iam ajn.

Ni ankaŭ ŝatus danki Mukul Murthy kaj Pranav Anand pro iliaj kontribuoj al ĉi tiu artikolo.

Aliaj artikoloj en tiu serio:

Plonĝu en Deltan Lago: Malpakante la Transakcian Protokolon

Rilataj Artikoloj

Produktadnivela maŝinlernado kun Delta Lake

Kio estas datuma lago?

Eksciu pli pri la kurso

fonto: www.habr.com

Aldoni komenton