Дельта көліне сүңгу: схеманы орындау және эволюция

Эй Хабр! Назарларыңызға мақаланың аудармасын ұсынамын «Дельта көліне сүңгу: схеманы қолдану және эволюция» Курстың басталуына орай дайындалған Бурак Явуз, Бреннер Хайнц және Денни Ли Деректер инженері OTUS компаниясынан.

Дельта көліне сүңгу: схеманы орындау және эволюция

Деректер, біздің тәжірибеміз сияқты, үнемі жинақталып, дамып отырады. Сәйкес болу үшін біздің әлемнің психикалық үлгілері жаңа деректерге бейімделуі керек, олардың кейбіреулері жаңа өлшемдерді қамтиды - бұрын біз білмеген нәрселерді бақылаудың жаңа тәсілдері. Бұл психикалық модельдер жаңа ақпаратты қалай жіктейтінімізді және өңдейтінімізді анықтайтын электрондық кестелердегі схемаларға ұқсамайды.

Бұл бізді схеманы басқару мәселесіне әкеледі. Бизнес мақсаттары мен талаптары уақыт өте келе дамыған сайын деректеріңіздің құрылымы да өзгереді. Delta Lake деректер өзгерген кезде жаңа өлшемдерді енгізуді жеңілдетеді. Пайдаланушылар кесте схемаларын басқару үшін қарапайым семантикаға қол жеткізе алады. Бұл құралдарға пайдаланушыларды кестелерді қателермен немесе қажетсіз деректермен байқаусызда толтырудан қорғайтын Schema Enforcement және сәйкес орындарда құнды деректерді қамтитын жаңа бағандарды автоматты түрде қосатын Schema Evolution кіреді. Бұл мақалада біз осы құралдарды пайдалануды тереңірек қарастырамыз.

Кесте схемаларын түсіну

Apache Spark бағдарламасындағы әрбір DataFrame деректер түрлері, бағандар және метадеректер сияқты деректер пішінін анықтайтын схеманы қамтиды. Delta Lake көмегімен кесте схемасы транзакция журналында JSON пішімінде сақталады.

Схеманы орындау дегеніміз не?

Схеманы орындау, сондай-ақ схеманы тексеру ретінде белгілі, кесте схемасына сәйкес келмейтін жазбаларды қабылдамау арқылы деректер сапасын қамтамасыз ететін Delta Lake жүйесіндегі қауіпсіздік механизмі. Тек брондауларды қабылдайтын танымал мейрамхананың иесі сияқты, Schema Enforcement кестеге енгізілген деректердің әрбір бағанының күтілетін бағандардың сәйкес тізімінде екенін тексереді (басқаша айтқанда, әрқайсысы үшін «брондау» бар ма) және тізімде жоқ бағандары бар кез келген жазбаларды қабылдамайды.

Схеманы орындау қалай жұмыс істейді?

Delta Lake жазу кезінде схеманы тексеруді пайдаланады, яғни кестеге барлық жаңа жазулар жазу уақытында мақсатты кестенің схемасымен үйлесімділік үшін тексеріледі. Егер схема үйлесімсіз болса, Delta Lake транзакцияны толығымен тоқтатады (ешқандай деректер жазылмайды) және сәйкессіздік туралы пайдаланушыны хабардар ету үшін ерекше жағдайды тудырады.
Delta Lake жазбаның кестемен үйлесімділігін анықтау үшін келесі ережелерді пайдаланады. DataFrame жазылады:

  • Ол мақсатты кестенің схемасында жоқ қосымша бағандарды қамтуы мүмкін емес. Керісінше, кіріс деректер кестедегі әрбір бағанды ​​қамтымаса, жақсы - бұл бағандарға жай ғана бос мәндер тағайындалады.
  • мақсатты кестедегі баған деректер түрінен ерекшеленетін баған деректерінің түрлері болуы мүмкін емес. Егер мақсатты кестедегі бағанда StringType деректері болса, бірақ DataFrame ішіндегі сәйкес бағанда IntegerType деректері болса, схеманы орындау ерекше жағдайды шығарады және жазу әрекетінің орын алуына жол бермейді.
  • тек жағдайда ғана ерекшеленетін баған атауларын қамтуы мүмкін емес. Бұл бір кестеде анықталған 'Foo' және 'foo' деп аталатын бағандарға ие бола алмайтыныңызды білдіреді. Spark регистрді немесе регистрді ескермейді (әдепкі бойынша), Delta Lake регистрді сақтайды, бірақ схеманы сақтау кезінде регистрді сезбейді. Паркет баған ақпаратын сақтау және алу кезінде регистрді ескереді. Ықтимал қателерді, деректердің бүлінуін немесе деректердің жоғалуын болдырмау үшін (біз 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 бақылау тақталары
  • Деректерді талдау және визуализация құралдары
  • Қатаң құрылымды, қатаң терілген семантикалық схемаларды қажет ететін кез келген өндіріс жүйесі.

Осы соңғы кедергіге өз деректерін дайындау үшін көптеген пайдаланушылар құрылымды кестелеріне біртіндеп енгізетін қарапайым «көп-хоп» архитектурасын пайдаланады. Қосымша ақпарат алу үшін сіз мақаланы оқи аласыз Delta Lake көмегімен өндірістік деңгейде машиналық оқыту.

Әрине, сіз схеманы орындауды құбыр желісінің кез келген жерінде пайдалана аласыз, бірақ бұл жағдайда кестеге жазу көңілсіз болуы мүмкін екенін есте сақтаңыз, мысалы, кіріс деректерге басқа бағанды ​​қосқаныңызды ұмытып кеткендіктен.

Деректердің сұйылтуының алдын алу

Осы сәтте сіз барлық әбігердің не туралы екенін сұрайтын шығарсыз? Ақыр соңында, кейде күтпеген «схема сәйкес келмеуі» қатесі сізді жұмыс үрдісінде бұзуы мүмкін, әсіресе Delta Lake-ге жаңадан келген болсаңыз. Неліктен мен DataFrame-ді еш нәрсеге қарамастан жаза алатындай етіп схеманы қажетінше өзгертуге мүмкіндік бермеске?

Бұрынғы мақал айтқандай, «алдын алудың бір унциясы бір фунт емге тұрарлық». Белгілі бір сәтте, схемаңызды орындауға қамқорлық жасамасаңыз, деректер түрінің үйлесімділік мәселелері олардың жағымсыз бастарын тудырады — біртекті болып көрінетін өңделмеген деректер көздері шеткі жағдайларды, бүлінген бағандарды, дұрыс емес бейнелеулерді немесе басқа қорқынышты армандарды қамтуы мүмкін. Ең жақсы әдіс - бұл жауларды схеманы орындау арқылы қақпада тоқтату және олар сіздің өндірістік кодыңыздың қараңғы тереңдігінде жасырынған кезде емес, олармен ашық түрде күресу.

Схеманы орындау кестеңіздің схемасы өзгертуді нақты мақұлдамайынша өзгермейтінін қамтамасыз етеді. Бұл деректерді сұйылтуды болдырмайды, ол жаңа бағандар соншалықты жиі қосылғанда орын алуы мүмкін, бұрынғы құнды, жинақы кестелер деректердің тасқынына байланысты мағынасы мен пайдалылығын жоғалтады. Сізді әдейі болуға, жоғары стандарттар орнатуға және жоғары сапаны күтуге шақыра отырып, схеманы орындау көздегенін дәл орындайды — тұтастықты сақтауға және кестелеріңізді таза ұстауға көмектеседі.

Егер әрі қарай қарастыра отырып, сіз шынымен солай деп шешсеңіз қажеттілік Жаңа бағанды ​​қосу қиындық туғызбайды; төменде бір жолды түзету берілген. Шешім - схема эволюциясы!

Схема эволюциясы дегеніміз не?

Схема эволюциясы — пайдаланушыларға кестенің ағымдағы схемасын уақыт өте өзгеретін деректерді орналастыру үшін оңай өзгертуге мүмкіндік беретін мүмкіндік. Ол бір немесе бірнеше жаңа бағандарды қосу үшін схеманы автоматты түрде бейімдеу үшін кірістіру немесе қайта жазу әрекеттері кезінде жиі пайдаланылады.

Схема эволюциясы қалай жұмыс істейді?

Алдыңғы бөлімдегі мысалдан кейін әзірлеушілер схемаға сәйкес келмеуіне байланысты бұрын қабылданбаған жаңа бағандарды қосу үшін схема эволюциясын оңай пайдалана алады. Схема эволюциясы қосу арқылы белсендіріледі .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

Дельта көліне сүңгу: схеманы орындау және эволюция
Немесе қосу арқылы бұл опцияны бүкіл Spark сеансы үшін орнатуға болады spark.databricks.delta.schema.autoMerge = True Spark конфигурациясына. Дегенмен, мұны сақтықпен пайдаланыңыз, себебі схеманың орындалуы сізге жоспарсыз схема сәйкессіздіктері туралы енді ескертпейді.

Сұраудағы параметрді қосу арқылы mergeSchemaDataFrame ішінде бар, бірақ мақсатты кестеде жоқ барлық бағандар жазу транзакциясы кезінде схемаға автоматты түрде қосылады. Кірістірілген өрістерді де қосуға болады және олар құрылымдағы сәйкес бағандарға да қосылады.

Деректер инженерлері мен ғалымдар бұл опцияны ескі бағандарға негізделген бар үлгілерді бұзбай, жаңа бағандарды (мүмкін жақында бақыланған метрика немесе осы айдағы сатылым көрсеткіштерінің бағаны) бар машиналық оқыту өндіріс кестелеріне қосу үшін пайдалана алады.

Кестені енгізу немесе қайта жазу кезінде схема эволюциясының бөлігі ретінде схеманы өзгертудің келесі түрлеріне рұқсат етіледі:

  • Жаңа бағандарды қосу (бұл ең көп таралған сценарий)
  • Деректер түрлерін NullType -> кез келген басқа түрден өзгерту немесе ByteType -> ShortType -> IntegerType ішінен жылжыту

Схема эволюциясында рұқсат етілмеген басқа өзгерістер схема мен деректерді қосу арқылы қайта жазуды талап етеді .option("overwriteSchema", "true")Мысалы, егер "Foo" бағаны бастапқыда бүтін сан болса және жаңа схема жол деректер түрі болса, онда барлық Parket (деректер) файлдарын қайта жазу қажет болады. Мұндай өзгерістерге мыналар жатады:

  • бағанды ​​жою
  • бар бағанның деректер түрін өзгерту (орнында)
  • тек қана әр түрлі болатын бағандардың атын өзгерту (мысалы, «Foo» және «foo»)

Соңында, келесі шығарылыммен, Spark 3.0, анық DDL (ALTER TABLE көмегімен) толық қолдау көрсетілетін болады, бұл пайдаланушыларға кесте схемаларында келесі әрекеттерді орындауға мүмкіндік береді:

  • бағандарды қосу
  • баған пікірлерін өзгерту
  • Транзакция журналын сақтау мерзімін орнату сияқты кестенің әрекетін анықтайтын кесте сипаттарын орнату.

Схема эволюциясының пайдасы қандай?

Схема эволюциясын кез келген уақытта пайдалануға болады ниет ету Кестенің схемасын өзгертіңіз (ДатаФrame-ге ол жерде болмауы керек кездейсоқ бағандарды қосуға қарсы). Бұл схеманы тасымалдаудың ең оңай жолы, себебі ол дұрыс баған атаулары мен деректер түрлерін оларды анық жарияламай-ақ автоматты түрде қосады.

қорытынды

Схеманы орындау кестеңізбен үйлеспейтін кез келген жаңа бағандарды немесе басқа схема өзгерістерін қабылдамайды. Осы жоғары стандарттарды орнату және қолдау арқылы талдаушылар мен инженерлер өз деректерінің ең жоғары тұтастық деңгейіне ие екеніне сенімді бола алады, бұл туралы нақты және қысқаша негіздеп, оларға тиімдірек бизнес шешімдерін қабылдауға мүмкіндік береді.

Екінші жағынан, схеманың эволюциясы орындауды жеңілдету арқылы толықтырады болжалды Схеманы автоматты түрде өзгерту. Өйткені, баған қосу соншалықты қиын болмауы керек.

Электр тізбегінің күшіне енуі эволюцияның иньінің ян болып табылады. Бірге пайдаланылған бұл мүмкіндіктер шуды басуды және сигналды реттеуді бұрынғыдан да жеңілдетеді.

Сондай-ақ осы мақалаға қосқан үлестері үшін Мукул Мурти мен Пранав Анандқа алғыс айтамыз.

Осы сериядағы басқа мақалалар:

Дельта көліне ену: транзакция журналын ашу

Бейнені ойнату

Қатысты мақалалар

Delta Lake көмегімен өндірістік деңгейде машиналық оқыту

Деректер көлі дегеніміз не?

Курс туралы көбірек біліңіз

Ақпарат көзі: www.habr.com

пікір қалдыру