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

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

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

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

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

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

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

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

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

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

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 конфигурациясына. Бірақ мұны сақтықпен пайдаланыңыз, өйткені схеманы орындау сізге жоспарсыз схема сәйкессіздіктері туралы енді ескертпейді.

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

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

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

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

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

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

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

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

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

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

қорытынды

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

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

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

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

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

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

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

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

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

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

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

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