Dive in Delta lacum: Schema Effectus et Evolutionis

Salve, Habr! Tibi operam tuam praebeo translationem articuli "Ding In Delta lacum: Schema Effectus & Evolutionis" auctores Burak Yavuz, Brenner Heintz et Denny Lee, qui in antecessum initio curriculi paratus erat. Data Engineer ex OTUS.

Dive in Delta lacum: Schema Effectus et Evolutionis

Data, sicut experientia nostra, constanter cumulant et evolvunt. Ad conservationem mentis nostrae exempla mundi accommodare debent ad novas notitias, quarum nonnullae novas dimensiones continent, novos modos rerum observandi, quas antea nullas habuimus. Haec exempla mentalia non multum differunt a schematibus schematis quae determinant quomodo categorizamus et novas informationes processimus.

Hoc nos inducit schema administrationis. Ut negotium provocationes et necessitates super tempus mutant, ita structura notitiarum tuarum. Delta Lake facilem facit novas mensuras cum notitiis mutationibus introducendis. Usores ad simplices semanticos accessum habent ad schemata mensae suae administrandam. Haec instrumenta includunt Schema Enforcement, quod utentes custodit ne suas tabulas erroribus vel superfluis notitiis polluat, et Schema Evolutionis, quae novas columnas pretiosorum notitias permittit ut propriis locis sponte addatur. In hoc articulo altius in his utens instrumentis inmittemus.

Mensam intelligens Schemas

Quaelibet DataFrame in Apache Scintilla continet schema, quod formam notitiarum definit, sicut species datae, columnae et metadata. Cum Delta Lake, schema mensa in forma JSON reponitur intra truncum transactionis.

Quae est ratio exactionis?

Schema Exactio, quae etiam Schema Validation vocatur, mechanismum securitatis est in Delta Lake, quae qualitatem datam praestat, reiectis monumentis quae schematis mensae non aequant. Sicut hospita in prima mensa reservationis popularis-tantum popinae, sistit an singulae columnae notitiarum in tabellam ingressi sint in serie columnarum exspectatarum respondentium (hoc est, an sit "reservatio" pro unaquaque earum. ) , et tabulas aliquas rejicit cum columnis non in indice.

Quomodo schema cogendi opus facit?

Delta Lake utitur schemate de scribendo inhibendo, quo significat omnia nova scribens ad mensam sedari ad convenientiam cum schematis schematis ad tempus scribendum. Si schema repugnet, Delta Lake transactionem omnino (nulla notitia scripta est) abortum facit et exceptionem ad usorem inconstantiae certiorem facit.
Delta Lake sequentibus regulis utitur ad utrum recordum cum tabula compatitur. DataFrame Writeable:

  • non capit additional columnas quae in schemate mensae non sunt. E contra, omnia praeclara sunt si notitiae venientes omnino omnes columnas e tabula non contineant - hae columnae simpliciter nullae valores assignabuntur.
  • non potest habere columnam data specierum quae sunt diversae a notitia specierum columnarum in tabula scopo. Si tabulae scopo columna data StringType contineat, sed respondens columna in DataFrame IntegerType data continet, schema cogendi exceptionem mittet et ne operatio scribae fiat.
  • columnae nomina quae in casu tantum differunt, continere non possunt. Hoc significat quod columnas habere non potes in eadem tabula definitas "Foo" et "foo" nominatas. Dum Scintilla adhiberi potest in modo insensibili vel casu-sensitivo (default), Delta Lake casus conservans est, sed sentit in schemate reposito. Parquet est casus sensitivus cum informatione actarum et redeundi columnae. Ad vitare errores possibiles, notitias corruptionis, seu notae detrimentum (quod apud Databrickum personaliter sumus experti), hanc limitationem addere decrevimus.

Ad hoc illustrandum, vide quae in codice infra fiunt, cum aliquas columnas nuper genitas ad mensam Delta Lake nondum conformatam adiungere conamur.

# Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ 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.

Instead of automatice novas columnas addit, Delta Lake schema schema imponit et scripturae cessat. Ad auxilium determinare quod columna (vel columnarum posuit) discrepantiam causat, Scintillae ambarum schematum e ACERVA vestigium comparationis exprimunt.

Quid prodest schema coercendi?

Cum schisma exactio satis restricta sit, optimum instrumentum est uti ostiario ad mundum, data plene transformata quae ad productionem vel consummationem parata est. Typice applicata ad tabulas quae directe datas pascunt;

  • Apparatus discendi algorithms
  • BI dashboards
  • Data analytica et visualization instrumenta
  • Quaelibet ratio productionis quae valde structuram requirit, schemas semanticos valde typos habet.

Ad notitias suas ad hanc cratem finalem apparandam, multi utentes utuntur architectura simplici "multi-hop", quae paulatim structuram in tabulas suas introducit. Ut plura de hoc discas, articulum inspicere potes Productio-gradus apparatus discendi cum Delta Lake.

Sane schema exactionis alicubi in pipelino tuo adhiberi potest, sed memento fluentem ad mensam in hoc casu frustrari posse, quia, exempli gratia, oblitus es aliam columnam ad ineuntes notitias addidisse.

Preoccupo data MIXTURA

Iam miraris, quid actumst? Post omnes, interdum inopinatus error "schema mismatch" te potest scandalizare in opera tua, praesertim si novus es ad Delta lacum. Cur non tantum schema mutatur quod opus est ut DataFrame mea scribere queam utcumque?

Ut in veteri proverbio dicitur, uncia praeventionis libra curationis valet. In aliquo puncto, si schema tuum compellere non curaveris, notitiarum congruentiae genus quaestiones turpia capita educant - quasi rudis notitiae homogeneae fontes in ore continere possunt casus, columnas corruptas, mappings depravationes, vel alia FORMIDULOSUS somniare in niis. Optima accessio est hos hostes in porta prohibere β€” cum schemate cogendi β€” et fac cum illis in luce, quam postea cum in tenebris intimos delitescere codicem productionis vestrae incipiunt.

Schema coercitionis dat tibi fiduciam, schema mensae tuae non mutare, nisi mutationem probes. Dilutionis notitia hoc impedit, quod fieri potest, cum novae columnae tam frequenter additae sunt ut ante pretiosae tabulae compressae significationem suam et utilitatem ob inundationem datam amittant. Hortando te ut voluntariam, alta signa, et qualitatem altam expectes, schema exactionis prorsus facit quod facere destinatum est - adiuva te manere conscium et schedae tuae mundae.

Si porro consideratione statuis quod vere opus Novam columnam adde - dubium non est, infra una linea fix est. Solutio est in circuitu evolutionis!

Quid est evolutionis schema?

Schema evolutionis pluma est quae utentes facile mutare schema mensa currentis permittit secundum notitias quae temporis mutationes. Saepissime adhibetur in operando appendice vel rescribe operando ad schema sponte aptandum ad unam vel plures columnas novas includendas.

Quomodo schema evolutionis operatur?

Sequentes exemplum e sectione praecedenti, facile tincidunt evolutionis schematis uti possunt ad novas columnas antea reiectas ob inconstantiam schematis addere. Circuitus evolutionis reducitur addendo .option('mergeSchema', 'true') ad Scintilla quadrigis .write ΠΈΠ»ΠΈ .writeStream.

# Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ mergeSchema
loans.write.format("delta") 
           .option("mergeSchema", "true") 
           .mode("append") 
           .save(DELTALAKE_SILVER_PATH)

Ut lacinia purus videre, sequenti scintilla SQL currunt interrogatione

# Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊ с Π½ΠΎΠ²Ρ‹ΠΌ столбцом, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ запись ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ
%sql
SELECT addr_state, sum(`amount`) AS amount
FROM loan_by_state_delta
GROUP BY addr_state
ORDER BY sum(`amount`)
DESC LIMIT 10

Dive in Delta lacum: Schema Effectus et Evolutionis
Vel, hanc optionem pro totius scintillae sessionis addere potes spark.databricks.delta.schema.autoMerge = True in Scintilla configurationem. Sed hoc caute utere, ut schema cogendi iam non te ad intentionem schema repugnantiae intendit.

Comprehendo ad petitionem parametri mergeSchemaomnes columnae quae in DataFrame insunt, sed non in mensa scopo, ipso fine schematis adduntur ut pars transactionis scribentis. Agros nidificantes etiam addi possunt et hae etiam in fine columnarum structurarum respondentium adiciuntur.

Date fabrum et notitiarum scientiarum hac optione uti possunt ad novas columnas addere (fortasse recenter investigata columna metrica vel huius mensis venditionesque perficiendi) ad machinas exsistentes tabulas productionis discendi sine exemplaribus antiquis columnis exsistentibus solvendis.

Sequentia schematis genera mutationes conceditur ut pars evolutionis schematis in mensa additionis vel rescribe:

  • Additis novis columnis (hoc est frequentissimum missionis)
  • Typi ex data NullType mutantur -> alia quaevis vel promovenda ex ByteType -> ShortType -> IntegerType

Aliae mutationes intra evolutionis schematis non concessae requirunt ut schema et notitia rescribantur addendo .option("overwriteSchema", "true"). Exempli gratia, in casu ubi columna "Foo" originaliter erat integer et novum schema chorda notationis genus erat, tunc omnes fasciculi Parquet (datae) opus erant ut rescriberentur. Mutationes includunt:

  • delendo columna
  • mutantur in columna existentium notitia genus (in-place)
  • renaming columnae quae tantum in casu differunt (exempli gratia "Foo" et "foo")

Denique, proxima emissione Spark 3.0, expressa DDL plene sustentabitur (utens ALTER TABLE) utentes utentes sequentes actiones in schematibus mensae exsequantur:

  • addit columnas
  • mutantur columnae comment
  • mensae proprietatibus disponendis, quae mores mensae moderantur, ut longitudinis temporis a transactionis stipes repositum sit.

Quid prodest ambitus evolutionis?

Schema evolutionis potest esse quotiens you intendo Schema mensae tuae muta (ut opponitur cum accidentaliter columnas adieceris ad DataFrame quae ibi non debet). Haec via facillima est schema tuum migrandi quia sponte addit rectas columnas nomina et genera data, quin eas explicite declaret.

conclusio,

Schema cogendi respuit quaslibet novas columnas vel alias schematis mutationes quae cum mensa tua non compatuntur. Haec alta signa analystae et fabrum constituendo et conservando fidere possunt eorum notitiae summam integritatis gradum habere, eam clare et clare communicantes, permittentes ut meliora negotia decernant.

Ex altera parte, schema evolutionis complementum cogendi simplificando asserta Schema latae sententiae mutationes. Ceterum agminis addere non difficile est.

Coacta applicatio schematis Yang est, ubi schema evolutionis yin est. Cum simul adhibita sunt, haec lineamenta suppressionem sonum faciunt et incedit facilior quam umquam.

Mukul Murthy et Pranav Anand pro contributionibus hoc articulum etiam gratias agere volumus.

Alii articuli in hac serie:

Dive in Delta lacum: Unpacking transactionis Log

Articuli in re

Productio-gradus apparatus discendi cum Delta Lake

Data lacus quid est?

Plura de cursu

Source: www.habr.com