ΠŸΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π² 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