{"id":82038,"date":"2020-05-19T01:42:26","date_gmt":"2020-05-18T23:42:26","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy"},"modified":"2020-05-19T01:42:26","modified_gmt":"2020-05-18T23:42:26","slug":"pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy","title":{"rendered":"Sukeldumine Delta Lake'i: skeemi sundrakendamine ja evolutsioon","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Tere, Habr! Esitlen teile t\u00f5lget artiklist <noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/09\/24\/diving-into-delta-lake-schema-enforcement-evolution.html\">\u00abSukeldumine Delta Lake'i: Skeemi Sundimine ja Evolutsioon\u00bb<\/a><\/noindex> autoriteks on Burak Yavuz, Brenner Heintz ja Denny Lee, kes valmistasid selle ette kursuse k\u00e4ivitamise eel <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/J1P5\/\">\u201eAndmeinsener\u201c<\/a><\/noindex> OTUS-e poolt.<\/b><\/i><\/p>\n<p><img decoding=\"async\" alt=\"Sukeldumine Delta Lake&#039;i: skeemi sundrakendamine ja evolutsioon\" src=\"\/wp-content\/uploads\/2020\/05\/1d20921d8d4a1c1e0f8afee4fc019024.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Andmed, nagu ka meie kogemused, kogunevad ja arenevad pidevalt. Et mitte maha j\u00e4\u00e4da, peavad meie vaimsed mudelid maailmast kohanduma uute andmetega, millest m\u00f5ned sisaldavad uusi m\u00f5\u00f5tmeid \u2014 uusi viise asjade j\u00e4lgimiseks, millest me enne teadlikud ei olnud. Need vaimsed mudelid ei erine palju tabeli skeemidest, mis m\u00e4\u00e4ravad, kuidas me uut teavet klassifitseerime ja t\u00f6\u00f6tleme.<\/p>\n<p>See viib meid skeemihalduse k\u00fcsimuseni. Aja jooksul, kui \u00e4rivajadused ja n\u00f5udmised muutuvad, muutub ka teie andmete struktuur. Delta Lake v\u00f5imaldab uusi m\u00f5\u00f5tmeid andmete muutumisel h\u00f5lpsalt rakendada. Kasutajatel on juurdep\u00e4\u00e4s lihtsatele semantikatele oma tabelite skeemide haldamiseks. Need t\u00f6\u00f6riistad sisaldavad skeemi sundimise (Schema Enforcement), mis kaitseb kasutajaid nende tabelite kogemata m\u00e4\u00e4rdumise eest vigade v\u00f5i mittevajalike andmetega, samuti skeemi evolutsiooni (Schema Evolution), mis v\u00f5imaldab automaatselt lisada uusi veerge v\u00e4\u00e4rtuslike andmetega vastavatesse kohtadesse. Selles artiklis uurime neid t\u00f6\u00f6riistu p\u00f5hjalikult.<\/p>\n<h2>Tabeli skeemide m\u00f5istmine<\/h2>\n<p>\nIga DataFrame Apache Sparkis sisaldab skeemi, mis m\u00e4\u00e4ratleb andmete kuju, nagu andmet\u00fc\u00fcbid, veerud ja \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435. Delta Lake'i abil salvestatakse tabeli skeem JSON-formaadis tehinguajalugu.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Mis on skeemi sundimine?<\/h2>\n<p>\nSkeemi sundimine (Schema Enforcement), tuntud ka kui skeemi valideerimine (Schema Validation), on Delta Lake'is kaitsemehhanism, mis tagab andmete kvaliteedi, l\u00fckates tagasi kirjed, mis ei vasta tabeli skeemile. Nagu populaarses restoranis registratuuris t\u00f6\u00f6le asunud hostess, kes v\u00f5tab vastu ainult eelnevalt broneeritud kohti, kontrollib ta, kas iga tabelisse sisestatava andmeveeru kohta on vastav oodatud veergude nimekiri (teisis\u00f5nu, kas iga\u00fche jaoks on olemas \u00abbroneering\u00bb), ning l\u00fckkab tagasi k\u00f5ik kirjed veergude kohta, mida nimekirjas ei ole.<\/p>\n<h2>Kuidas skeemi sundimine t\u00f6\u00f6tab?<\/h2>\n<p>\nDelta Lake kasutab salvestamisel skeemi kontrollimist, mis t\u00e4hendab, et k\u00f5ik uued kirjed tabelisse kontrollitakse sihttabeli skeemiga \u00fchilduvuse osas salvestamise ajal. Kui skeem ei \u00fchildu, t\u00fchistab Delta Lake t\u00e4ielikult tehingu (andmed ei salvestata) ja loob erandi, et teavitada kasutajat vastuolust.<br \/>\nKirje \u00fchilduvuse m\u00e4\u00e4ramiseks kasutab Delta Lake j\u00e4rgmisi reegleid. Salvestatav DataFrame:<\/p>\n<ul>\n<li>ei tohi sisaldada lisa veerge, mida sihttabeli skeemis pole. Ja vastupidi, k\u00f5ik on korras, kui sisendandmed ei sisalda t\u00e4ielikult k\u00f5iki tabeleid \u2014 nendele veergudele lihtsalt omistatakse nullv\u00e4\u00e4rtused.<\/li>\n<li>ei tohi omada veergude andmet\u00fc\u00fcpide erinevusi sihttabeli veergude andmet\u00fc\u00fcpides. Kui sihttabeli veerg sisaldab andmeid StringType, kuid vastav veerg DataFrame'is sisaldab andmeid IntegerType, sunnib skeemi rakendamine erandi tekkimist ja takistab salvestamisoperatsiooni.<\/li>\n<li>ei saa sisaldada veergude nimesid, mis erinevad ainult suurte ja v\u00e4ikeste t\u00e4htede poolest. See t\u00e4hendab, et teil ei saa olla veerge nimedega 'Foo' ja 'foo', mis on m\u00e4\u00e4ratud \u00fches tabelis. Kuigi Spark'i saab kasutada suurustunne poolest tundlikus v\u00f5i tundmatus (vaikimisi) re\u017eiimis, s\u00e4ilitab Delta Lake suurustunde, kuid on skeemi salvestamisel tundmatu. Parquet on salvestamise ja veeru teabe tagastamise korral suurustundlik. V\u00f5imalike vigade, andmekahjustuse v\u00f5i andmete kadumise v\u00e4ltimiseks (mille kogemuse oleme isiklikult Databricks'is kogenud) otsustasime selle piiri lisada.<\/li>\n<\/ul>\n<p>\nSelle illustreerimiseks vaatame, mis juhtub allolevas koodis, kui p\u00fc\u00fcame lisada m\u00f5ned hiljuti loodud veerud Delta Lake'i tabelisse, mis ei ole veel nende vastuv\u00f5tmiseks seadistatud.<\/p>\n<pre><code class=\"apache\"># \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c DataFrame \u0441\u0441\u0443\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0430\u0448\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 Delta Lake\nloans = sql(&quot;&quot;&quot;\n            SELECT addr_state, CAST(rand(10)*count as bigint) AS count,\n            CAST(rand(10) * 10000 * count AS double) AS amount\n            FROM loan_by_state_delta\n            &quot;&quot;&quot;)\n\n# \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443 DataFrame\noriginal_loans.printSchema()\n\nroot\n  |-- addr_state: string (nullable = true)\n  |-- count: integer (nullable = true)\n \n# \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u043e\u0432\u0443\u044e \u0441\u0445\u0435\u043c\u0443 DataFrame\nloans.printSchema()\n \nroot\n  |-- addr_state: string (nullable = true)\n  |-- count: integer (nullable = true)\n  |-- amount: double (nullable = true) # new column\n \n# \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 DataFrame (\u0441 \u043d\u043e\u0432\u044b\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u043c) \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443\nloans.write.format(&quot;delta&quot;) \n           .mode(&quot;append&quot;) \n           .save(DELTALAKE_PATH)\n\nReturns:\n\nA schema mismatch detected when writing to the Delta table.\n \nTo enable schema migration, please set:\n'.option(&quot;mergeSchema&quot;, &quot;true&quot;)'\n \nTable schema:\nroot\n-- addr_state: string (nullable = true)\n-- count: long (nullable = true)\n \nData schema:\nroot\n-- addr_state: string (nullable = true)\n-- count: long (nullable = true)\n-- amount: double (nullable = true)\n \nIf Table ACLs are enabled, these options will be ignored. Please use the ALTER TABLE command for changing the schema.<\/code><\/pre>\n<p>\nUute veergude automaatse lisamise asemel kehtestab Delta Lake skeemi ja peatab salvestamise. Et aidata m\u00e4\u00e4rata, milline veerg (v\u00f5i nende hulk) p\u00f5hjustab vastuolu, v\u00e4ljastab Spark m\u00f5lemad skeemid j\u00e4lgimisteatega v\u00f5rdlemiseks.<\/p>\n<h2>Mis kasu on skeemi sundrakendamisest?<\/h2>\n<p>\nKuna sundrakendamine skeem on piisavalt range kontroll, on see suurep\u00e4rane t\u00f6\u00f6riist, mida kasutada puhta, t\u00e4ielikult muudetud andmestiku v\u00e4ravavahtina, mis on tootmiseks v\u00f5i tarbimiseks valmis. Seda rakendatakse tavaliselt tabelitele, mis esitavad andmeid otse:<\/p>\n<ul>\n<li>Masin\u00f5ppe algoritmid<\/li>\n<li>BI armatuurlaudadele<\/li>\n<li>Andmeanal\u00fc\u00fcsile ja visualiseerimist\u00f6\u00f6riistadele<\/li>\n<li>Igas produktsioonis\u00fcsteemis, mis n\u00f5uab rangeid struktureeritud, rangelt t\u00fcpiseeritud semantilisi skeeme.<\/li>\n<\/ul>\n<p>\nEt valmistada oma andmeid ette selleks viimaseks takistuseks, kasutavad paljud kasutajad lihtsat \"multi-hop\" arhitektuuri, mis j\u00e4rk-j\u00e4rgult lisab struktuuri nende tabelitesse. Kui soovite sellest rohkem teada, v\u00f5ite tutvuda artikliga <noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/14\/productionizing-machine-learning-with-delta-lake.html\">Produktsioonitasemel masin\u00f5pe Delta Lake'iga.<\/a><\/noindex><\/p>\n<p>Muidugi v\u00f5ib sundrakendamist skeemid kasutada igas teie andmet\u00f6\u00f6deldusse, kuid pidage meeles, et voogedastuse kirjutamine tabelisse v\u00f5ib sellisel juhul olla frustreeriv, kuna n\u00e4iteks v\u00f5ite unustada, et olete lisanud veel \u00fche veeru sisendandmetesse.<\/p>\n<h2>Andmete vedeliku v\u00e4ltimine<\/h2>\n<p>\nSelles etapis v\u00f5ite k\u00fcsida, mis p\u00f5hjustab sellist elevust? L\u00f5ppude l\u00f5puks, m\u00f5nikord v\u00f5ib ootamatu \"skeemi mittevastavuse\" viga segada teie t\u00f6\u00f6voogu, eriti kui olete Delta Lake'is uus. Miks mitte lihtsalt lasta skeemil muutuda nii, nagu on vajalik oma DataFrame'i kirjutamiseks, vaatamata k\u00f5igele?<\/p>\n<p>Nagu vana \u00fctlus \u00fctleb, \"unts ennetust maksab naela ravi.\" Teatud hetkel, kui te ei hooli oma skeemi rakendamisest, toovad andmet\u00fc\u00fcbi \u00fchilduvuse probleemid oma vastikud pead v\u00e4lja - esmapilgul homogeenne toorse andmeallikate all v\u00f5ivad peituda \u00e4\u00e4rmuslikud juhud, kahjustatud veerud, valesti vormistatud kaardistused v\u00f5i muud hirmutavad asjad, mis k\u00e4tkivad \u00f6iseid \u00f5udusunen\u00e4gusid. Parim l\u00e4henemine on need vaenlased v\u00e4ravas peatada - sundrakendamise skeemiga - ja tegeleda nendega avatult, mitte hiljem, kui nad hakkavad hiilima teie t\u00f6\u00f6tava koodi tumedatesse s\u00fcgavustesse.<\/p>\n<p>Sunnitud vahevormi rakendamine annab kindlustunde, et teie tabeli skeem ei muutu, kui te ise ei kinnita muudatusi. See takistab andmete \"lahjendamist\", mis v\u00f5ib juhtuda, kui uusi veerge lisatakse nii sageli, et varem v\u00e4\u00e4rtuslikud, kompaktsed tabelid kaotavad oma v\u00e4\u00e4rtuse ja kasulikkuse andmemere t\u00f5ttu. Sunni rakendamine kutsub teid olema teadlik, seadma k\u00f5rgeid standardeid ja ootama k\u00f5rget kvaliteeti, v\u00f5imaldades teil j\u00e4\u00e4da kohusetundlikuks ja teie tabelid puhtaks.<\/p>\n<p>Kui otsustate edasise kaalumise k\u00e4igus, et teie jaoks on tegelikult <i>vajalik<\/i> uus veerg lisada \u2013 pole probleemi, allpool on \u00fche rea lahendus. Lahendus on skeemi evolutsioon!<\/p>\n<h2>Mis on skeemi evolutsioon?<\/h2>\n<p>\nSkeemi evolutsioon on funktsioon, mis v\u00f5imaldab kasutajatel h\u00f5lpsasti muuta tabeli skeemi vastavalt andmetele, mis aja jooksul muutuvad. Seda kasutatakse k\u00f5ige sagedamini lisamise v\u00f5i \u00fclekirjutamise operatsiooni k\u00e4itlemisel, et automaatselt kohandada skeemi \u00fche v\u00f5i mitme uue veeru lisamiseks.<\/p>\n<h2>Kuidas skeemi evolutsioon toimib?<\/h2>\n<p>\nEelmise peat\u00fcki n\u00e4idet j\u00e4rgides saavad arendajad h\u00f5lpsasti kasutada skeemi evolutsiooni, et lisada uusi veerge, mis olid varem skeemiga sobimatuse t\u00f5ttu tagasil\u00fckatud. Skeemi evolutsioon aktiveeritakse, lisades <code>.option('mergeSchema', 'true')<\/code> teie Spark k\u00e4sule <code>.write v\u00f5i .writeStream.<\/code><\/p>\n<pre><code class=\"apache\"># \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 mergeSchema\nloans.write.format(&quot;delta&quot;) \n           .option(&quot;mergeSchema&quot;, &quot;true&quot;) \n           .mode(&quot;append&quot;) \n           .save(DELTALAKE_SILVER_PATH)<\/code><\/pre>\n<p>\nGraafiku n\u00e4gemiseks k\u00e4ivitage j\u00e4rgmine Spark SQL p\u00e4ring<\/p>\n<pre><code class=\"apache\"># \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0433\u0440\u0430\u0444\u0438\u043a \u0441 \u043d\u043e\u0432\u044b\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c, \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u043e\u0448\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\n%sql\nSELECT addr_state, sum(`amount`) AS amount\nFROM loan_by_state_delta\nGROUP BY addr_state\nORDER BY sum(`amount`)\nDESC LIMIT 10<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Sukeldumine Delta Lake&#039;i: skeemi sundrakendamine ja evolutsioon\" src=\"\/wp-content\/uploads\/2020\/05\/873ce67da00f69696d5b9328bd90793a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAlternatiivselt saate selle valiku seada kogu Spark seansi jaoks, lisades <code>spark.databricks.delta.schema.autoMerge = True<\/code> Spark seadistuses. Aga olge ettevaatlik, sest sunnitud skeemi rakendamine ei hoiataks teid enam soovimatute skeemiga mittevastavuste eest.<\/p>\n<p>K\u00e4itumise p\u00e4ringusse lisamine <code>mergeSchema<\/code>, k\u00f5ik veerud, mis on olemas DataFrames, kuid puuduvad sihttabelis, lisatakse automaatselt skeemi l\u00f5puks kirje tehingu raames. Samuti v\u00f5ivad lisanduda sisemise v\u00e4ljad, mis lisatakse samuti vastavate veergude struktuuri l\u00f5ppu.<\/p>\n<p>Kuup\u00e4eva insenerid ja teadlased saavad kasutada seda valikut, et lisada oma olemasolevatesse masin\u00f5ppe tootmistabelitesse uusi veerge (nt hiljuti j\u00e4lgitav m\u00f5\u00f5dik v\u00f5i selle kuu m\u00fc\u00fcgiv\u00e4\u00e4rtuste veerg) ilma, et rikuks olemasolevaid mudeleid, mis p\u00f5hinevad vanadel veergudel. <\/p>\n<p>J\u00e4rgnevad skeemi muutmise t\u00fc\u00fcbid on lubatud skeemi evolutsiooni raames tabeli lisamisel v\u00f5i \u00fclekirjutamisel:<\/p>\n<ul>\n<li>Uute veergude lisamine (see on k\u00f5ige levinum stsenaarium)<\/li>\n<li>Andmet\u00fc\u00fcpide muutmine NullType -&gt; m\u00f5ni teine t\u00fc\u00fcp v\u00f5i t\u00f5stmine ByteType -&gt; ShortType -&gt; IntegerType<\/li>\n<\/ul>\n<p>\nTeised muutused, mis ei ole lubatud skeemi evolutsiooni raames, n\u00f5uavad, et skeem ja andmed kirjutataks \u00fcle, lisades <code>.option(\"overwriteSchema\", \"true\")<\/code>. N\u00e4iteks, kui veerg \"Foo\" oli algselt integer ja uus skeem oleks stringi andmet\u00fc\u00fcp, siis k\u00f5ik Parquet failid (andmed) tuleks \u00fcmber kirjutada. Selliste muudatuste hulka kuuluvad:<\/p>\n<ul>\n<li>veeru eemaldamine<\/li>\n<li>olemasoleva veeru andmet\u00fc\u00fcbi muutmine (kohapeal)<\/li>\n<li>veergude \u00fcmbernimetamine, mis erinevad vaid suur- ja v\u00e4iket\u00e4htedes (nt \"Foo\" ja \"foo\")<\/li>\n<\/ul>\n<p>\nL\u00f5puks, koos j\u00e4rgmise Spark 3.0 v\u00e4ljaandmisega toetatakse t\u00e4ielikult selget DDL (kasutades ALTER TABLE), mis v\u00f5imaldab kasutajatel teha j\u00e4rgmisi toiminguid tabelite skeemidega:<\/p>\n<ul>\n<li>veergude lisamine<\/li>\n<li>veergude kommentaaride muutmine<\/li>\n<li>tabeli omaduste seadistamine, mis m\u00e4\u00e4ravad tabeli k\u00e4itumise, n\u00e4iteks tehinguajaloogile s\u00e4ilitamise kestuse seadmine.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Mis on skeemi evolutsiooni kasu?<\/h2>\n<p>\nSkeemi evolutsiooni saab kasutada alati, kui te <i>kavatsete<\/i> muuta oma tabeli skeemi (vastupidiselt juhtumitele, kui olete kogemata lisanud oma DataFrame'i veerge, mida seal olema ei peaks). See on k\u00f5ige lihtsam viis oma skeemi migreerimiseks, kuna see lisab automaatselt \u00f5iged veergude nimed ja andmet\u00fc\u00fcbid ilma, et neid tuleks selgelt deklareerida.<\/p>\n<h2>Kokkuv\u00f5te<\/h2>\n<p>\nSunnitud rakendamine skeem muudab k\u00f5ik uued veerud v\u00f5i muud skeemimuudatused, mis ei \u00fchildu teie tabeliga, automaatselt kehtetuks. Nende k\u00f5rgete standardite seadmine ja s\u00e4ilitamine v\u00f5imaldab anal\u00fc\u00fctikutel ja inseneridel usaldada, et nende andmed on k\u00f5rgeimal tasemel terviklikkuses, arutledes selle \u00fcle selgelt ja arusaadavalt, mis v\u00f5imaldab neil teha t\u00f5husamaid \u00e4riotsuseid.<\/p>\n<p>Teiselt poolt t\u00e4iendab skeemi evolutsioon sunnitud rakendamist, muutes selle lihtsamaks <i>ennustatud<\/i> automaatsete skeemimuudatuste puhul. L\u00f5ppude l\u00f5puks ei tohiks see olla keeruline \u2014 lisada veerg.<\/p>\n<p>Sunnitud rakendamine on yang, samas kui skeemi evolutsioon on yin. Koos kasutades muudavad need funktsioonid m\u00fcra summutamise ja signaali seadistamise lihtsamaks nagu kunagi varem.<\/p>\n<p><i>Tahame samuti t\u00e4nada Mukula Murti ja Pranav Anandi nende panuse eest selle artikli kallal.<\/i><\/p>\n<p>Teised artiklid sellest sarjast:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/21\/diving-into-delta-lake-unpacking-the-transaction-log.html\">S\u00fcvenemine Delta Lake'i: tehingute logi avamine<\/a><\/noindex><\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"tjb10n5wVs8\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/tjb10n5wVs8\/hqdefault.jpg\" alt=\"M\u00e4ngi videot\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h2>Seotud artiklid<\/h2>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/14\/productionizing-machine-learning-with-delta-lake.html\">T\u00f6\u00f6stuslikult t\u00f5hus masin\u00f5pe Delta Lake'i abil<\/a><\/noindex><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/discover\/data-lakes\/introduction\">Mis on andmej\u00e4rv?<\/a><\/noindex><\/p>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/J1P5\/\">Tutvu kursusega l\u00e4hemalt<\/a><\/noindex><\/p>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/502324\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u00abDiving Into Delta Lake: Schema Enforcement &amp; Evolution\u00bb \u0430\u0432\u0442\u043e\u0440\u043e\u0432 Burak Yavuz, Brenner Heintz and Denny Lee, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430 \u00abData Engineer\u00bb \u043e\u0442 OTUS. \u0414\u0430\u043d\u043d\u044b\u0435, \u043a\u0430\u043a \u0438 \u043d\u0430\u0448 \u043e\u043f\u044b\u0442, \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0442\u0441\u044f. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u0442\u044c, \u043d\u0430\u0448\u0438 \u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u0438\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a \u043d\u043e\u0432\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":82039,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-82038","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432 Delta Lake: \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0441\u0445\u0435\u043c\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-18T23:42:26+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-18T23:42:26+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47S\u00fcvenemine Delta Lake'i: sunnitud rakendamine ja skeemi evolutsioon | ProHoster","description":"Tere, Habr!","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432 Delta Lake: \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0441\u0445\u0435\u043c\u044b | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-18T23:42:26+00:00","article:modified_time":"2020-05-18T23:42:26+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"82038","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 15:45:28","updated":"2022-09-29 13:43:45","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/82038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=82038"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/82038\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/82039"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=82038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=82038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=82038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}