{"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\/da\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy","title":{"rendered":"Dyk ned i Delta Lake: tvungen anvendelse og udvikling af skemaet","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Hej, Habr! Jeg pr\u00e6senterer for jer overs\u00e6ttelsen af artiklen <noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/09\/24\/diving-into-delta-lake-schema-enforcement-evolution.html\">\u00abDykning i Delta Lake: Skema Overholdelse &amp; Evolution\u00bb<\/a><\/noindex> af forfatterne Burak Yavuz, Brenner Heintz og Denny Lee, som blev forberedt op til kursusstarten <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/J1P5\/\">\u00abData Engineer\u00bb<\/a><\/noindex> fra OTUS.<\/b><\/i><\/p>\n<p><img decoding=\"async\" alt=\"Dyk ned i Delta Lake: tvungen anvendelse og udvikling af skemaet\" src=\"\/wp-content\/uploads\/2020\/05\/1d20921d8d4a1c1e0f8afee4fc019024.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Data, ligesom vores erfaring, akkumuleres og udvikles konstant. For ikke at falde bagud skal vores mentale modeller af verden tilpasses de nye data, hvoraf nogle indeholder nye dimensioner - nye m\u00e5der at observere ting, som vi tidligere ikke havde kendskab til. Disse mentale modeller adskiller sig ikke v\u00e6sentligt fra skemaerne for tabeller, som definerer, hvordan vi klassificerer og behandler ny information.<\/p>\n<p>Dette bringer os til sp\u00f8rgsm\u00e5let om skemastyring. Efterh\u00e5nden som forretningsopgaver og krav \u00e6ndrer sig over tid, \u00e6ndrer strukturen af dine data sig ogs\u00e5. Delta Lake giver mulighed for nemt at implementere nye dimensioner, n\u00e5r dataene \u00e6ndrer sig. Brugerne har adgang til en simpel semantik for at administrere skemaerne for deres tabeller. Disse v\u00e6rkt\u00f8jer inkluderer skemaoverholdelse (Schema Enforcement), som beskytter brugerne mod utilsigtet at forurene deres tabeller med fejl eller un\u00f8dvendige data, samt skemaevolution (Schema Evolution), som g\u00f8r det muligt automatisk at tilf\u00f8je nye kolonner med v\u00e6rdifulde data p\u00e5 de relevante steder. I denne artikel vil vi dykke ned i brugen af disse v\u00e6rkt\u00f8jer.<\/p>\n<h2>Forst\u00e5else af skemaer for tabeller<\/h2>\n<p>\nHver DataFrame i Apache Spark indeholder et skema, der definerer formet p\u00e5 data, s\u00e5som datatyper, kolonner og metadata. Med Delta Lake gemmes skemaet for tabellen i JSON-format inden i transaktionsloggen.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Hvad er skemaoverholdelse?<\/h2>\n<p>\nSkemaoverholdelse (Schema Enforcement), ogs\u00e5 kendt som skema-validering (Schema Validation), er en beskyttelsesmekanisme i Delta Lake, som sikrer datakvaliteten ved at afvise poster, der ikke svarer til tabellens skema. Ligesom en receptionist i en popul\u00e6r restaurant, der kun accepterer reservationer, kontrollerer den, om hver datakolonne, der indtastes i tabellen, er p\u00e5 den tilsvarende liste over forventede kolonner (med andre ord, om der er en 'reservation' for hver af dem) og afviser enhver post med kolonner, der ikke er p\u00e5 listen.<\/p>\n<h2>Hvordan fungerer skemaoverholdelse?<\/h2>\n<p>\nDelta Lake anvender skemakontrol ved skrivning, hvilket betyder, at alle nye poster i tabellen kontrolleres for kompatibilitet med skemaet for den m\u00e5lrettede tabel under skrivning. Hvis skemaet er inkompatibelt, annullerer Delta Lake transaktionen helt (data skrives ikke), og der oprettes et undtagelse for at informere brugeren om uoverensstemmelsen.<br \/>\nFor at bestemme kompatibiliteten af \u200b\u200ben post bruger Delta Lake f\u00f8lgende regler. Den skrivne DataFrame:<\/p>\n<ul>\n<li>kan ikke indeholde yderligere kolonner, som ikke findes i skemaet for den m\u00e5lrettede tabel. Og omvendt, er det i orden, hvis de indkommende data ikke indeholder alle kolonner fra tabellen - disse kolonner vil blot blive tildelt nul-v\u00e6rdier.<\/li>\n<li>kan ikke have kolonnedata typer, der adskiller sig fra kolonnedata typerne i den m\u00e5lrettede tabel. Hvis en kolonne i den m\u00e5lrettede tabel indeholder data af typen StringType, men den tilsvarende kolonne i DataFrame indeholder data af typen IntegerType, vil tvangsanvendelse af skemaet kaste en undtagelse og forhindre fuldf\u00f8relsen af skrivningsoperationen.<\/li>\n<li>kan ikke indeholde kolonnenavne, der kun adskiller sig i store og sm\u00e5 bogstaver. Det betyder, at du ikke kan have kolonner med navne 'Foo' og 'foo', defineret i samme tabel. Selvom Spark kan bruges i en f\u00f8lsom eller uf\u00f8lsom (som standard) tilstandsindstilling, gemmer Delta Lake store og sm\u00e5 bogstaver, men er uf\u00f8lsom i forhold til skemalagring. Parquet er f\u00f8lsom over for store og sm\u00e5 bogstaver ved lagring og returnering af kolonneinformation. For at undg\u00e5 potentielle fejl, dataskader eller tab (hvilket vi personligt har oplevet i Databricks), har vi besluttet at tilf\u00f8je denne begr\u00e6nsning.<\/li>\n<\/ul>\n<p>\nFor at illustrere dette, lad os se p\u00e5, hvad der sker i den f\u00f8lgende kode, n\u00e5r vi pr\u00f8ver at tilf\u00f8je nogle nyligt genererede kolonner i en Delta Lake-tabel, som endnu ikke er konfigureret til at acceptere dem.<\/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>\nI stedet for automatisk at tilf\u00f8je nye kolonner, h\u00e5ndh\u00e6ver Delta Lake skemaet og stopper skrivningen. For at hj\u00e6lpe med at identificere hvilken kolonne (eller flere) der for\u00e5rsager uoverensstemmelsen, udskriver Spark begge skemaer fra staksporet til sammenligning.<\/p>\n<h2>Hvad er fordelene ved tvangsanvendelse af skema?<\/h2>\n<p>\nDa tvinge anvendelsen af skemaet er en tilstr\u00e6kkelig striks kontrol, s\u00e5 det er et fremragende v\u00e6rkt\u00f8j til at fungere som en portvagt for et rent, helt transformeret datas\u00e6t, der er klar til produktion eller forbrug. Det anvendes typisk p\u00e5 tabeller, der direkte leverer data:<\/p>\n<ul>\n<li>Maskinl\u00e6ringsalgoritmer<\/li>\n<li>BI dashboards<\/li>\n<li>Dataanalyse og visualiseringsv\u00e6rkt\u00f8jer<\/li>\n<li>Enhver produktionssystem, der kr\u00e6ver strengt strukturerede, strengt typede semantiske skemaer.<\/li>\n<\/ul>\n<p>\nFor at forberede dine data til denne endelige barriere anvender mange brugere en simpel 'multi-hop' arkitektur, som gradvist tilf\u00f8jer struktur til deres tabeller. For at l\u00e6re mere om dette kan du l\u00e6se artiklen <noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/14\/productionizing-machine-learning-with-delta-lake.html\">Maskinl\u00e6ring p\u00e5 produktionsniveau med Delta Lake.<\/a><\/noindex><\/p>\n<p>Selvf\u00f8lgelig kan tvinge anvendelsen af skemaet bruges hvor som helst i din pipeline, men husk at str\u00f8mmende skrivning til tabellen i s\u00e5danne tilf\u00e6lde kan v\u00e6re frustrerende, fordi du for eksempel glemmer, at du har tilf\u00f8jet en yderligere kolonne til de indkommende data.<\/p>\n<h2>Forebyggelse af datadybning<\/h2>\n<p>\nP\u00e5 dette tidspunkt kan du sp\u00f8rge dig selv, hvad al denne ops\u00e6tning handler om? I sidste ende kan en uventet 'skema mismatch'-fejl pludselig binde dine h\u00e6nder i dit arbejdsflow, is\u00e6r hvis du er ny i Delta Lake. Hvorfor ikke bare lade skemaet \u00e6ndre sig, som det skal, s\u00e5 jeg kan skrive mit DataFrame, uanset hvad?<\/p>\n<p>Som det gamle ordsprog siger, 'en ounce forebyggelse er v\u00e6rd en pund behandling'. P\u00e5 et tidspunkt, hvis du ikke passer p\u00e5 anvendelsen af dit skema, vil problemer med datatypernes kompatibilitet stige op \u2014 tilsyneladende ensartede kilder til r\u00e5data kan indeholde gr\u00e6nsetilf\u00e6lde, beskadigede kolonner, forkert dannede mappinger eller andre uhyggelige ting, der bes\u00f8ger dine mareridt. Den bedste tilgang er at stoppe disse fjender ved porten \u2014 med hj\u00e6lp af tvinge anvendelsen af skemaet \u2014 og tage sig af dem i lyset, og ikke senere, n\u00e5r de begynder at snuse rundt i de m\u00f8rke dybder af din arbejds kode.<\/p>\n<p>Den tvingende anvendelse af skemaet giver dig sikkerhed for, at dit tabelskema ikke \u00e6ndres, medmindre du selv bekr\u00e6fter en \u00e6ndring. Dette forhindrer 'fortynding' af data, der kan ske, n\u00e5r nye kolonner tilf\u00f8jes s\u00e5 ofte, at tidligere v\u00e6rdifulde, komprimerede tabeller mister deres v\u00e6rdi og nytte p\u00e5 grund af en oversv\u00f8mmelse af data. Ved at opfordre dig til at v\u00e6re bevidst, s\u00e6tte h\u00f8je standarder og forvente h\u00f8j kvalitet, g\u00f8r den tvingende anvendelse af skemaet pr\u00e6cis det, det er designet til \u2014 at hj\u00e6lpe dig med at v\u00e6re samvittighedsfuld, og dine tabeller med at forblive rene.<\/p>\n<p>Hvis du ved n\u00e6rmere overvejelse beslutter, at du faktisk <i>man skal<\/i> vil tilf\u00f8je en ny kolonne \u2014 intet problem, her er en enkel rettelse. L\u00f8sningen er evolutionen af skemaet!<\/p>\n<h2>Hvad er evolutionen af skemaet?<\/h2>\n<p>\nEvolutionen af skemaet er en funktion, der g\u00f8r det nemt for brugere at \u00e6ndre det nuv\u00e6rende tabelskema i takt med, at dataene \u00e6ndrer sig over tid. Den bruges oftest, n\u00e5r man tilf\u00f8jer eller overskriver data for automatisk at tilpasse skemaet til at inkludere en eller flere nye kolonner.<\/p>\n<h2>Hvordan fungerer evolutionen af skemaet?<\/h2>\n<p>\nVed at f\u00f8lge eksemplet fra det foreg\u00e5ende afsnit kan udviklere nemt bruge evolutionen af skemaet til at tilf\u00f8je nye kolonner, der tidligere er blevet afvist p\u00e5 grund af skemaoverensstemmelse. Evolutionen af skemaet aktiveres ved at tilf\u00f8je <code>.option('mergeSchema', 'true')<\/code> til din Spark-kommando <code>.write eller .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>\nFor at se grafen skal du udf\u00f8re f\u00f8lgende Spark SQL-foresp\u00f8rgsel<\/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=\"Dyk ned i Delta Lake: tvungen anvendelse og udvikling af skemaet\" src=\"\/wp-content\/uploads\/2020\/05\/873ce67da00f69696d5b9328bd90793a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAlternativt kan du indstille denne mulighed for hele Spark-sessionen ved at tilf\u00f8je <code>spark.databricks.delta.schema.autoMerge = True<\/code> til Spark-konfigurationen. Men v\u00e6r forsigtig med dette, da den tvingende anvendelse af skemaet ikke l\u00e6ngere vil advare dig om utilsigtede skemaoverensstemmelser.<\/p>\n<p>Ved at inkludere parameteren <code>mergeSchema<\/code>, vil alle kolonner, der findes i DataFrame, men mangler i m\u00e5l tabellen, automatisk blive tilf\u00f8jet til slutningen af skemaet som en del af skrive-transaktionen. N\u00e6stede felter kan ogs\u00e5 blive tilf\u00f8jet, og de vil ogs\u00e5 blive tilf\u00f8jet til slutningen af de tilsvarende kolonner i strukturen.<\/p>\n<p>Ingeni\u00f8rer og forskere kan bruge denne mulighed til at tilf\u00f8je nye kolonner (m\u00e5ske en nyligt overv\u00e5get metrik eller en kolonne med salgstal for denne m\u00e5ned) til deres eksisterende produktionsmodeller for maskinl\u00e6ring uden at bryde de eksisterende modeller, der er baseret p\u00e5 de gamle kolonner. <\/p>\n<p>F\u00f8lgende typer af skema\u00e6ndringer er acceptable inden for skemaets evolution, mens man tilf\u00f8jer eller overskriver en tabel:<\/p>\n<ul>\n<li>Tilf\u00f8jelse af nye kolonner (dette er det mest almindelige scenarie)<\/li>\n<li>\u00c6ndring af datatyper fra NullType -&gt; enhver anden type eller opgradering fra ByteType -&gt; ShortType -&gt; IntegerType<\/li>\n<\/ul>\n<p>\nAndre \u00e6ndringer, der ikke er tilladt inden for skemaets evolution, kr\u00e6ver, at b\u00e5de skemaet og dataene bliver overskrevet ved at tilf\u00f8je <code>.option(\"overwriteSchema\", \"true\")<\/code>. For eksempel, hvis kolonnen \"Foo\" oprindeligt var integer, og det nye skema skulle v\u00e6re af strengdatatypen, ville alle Parquet-filer (data) skulle overskrives. S\u00e5danne \u00e6ndringer inkluderer:<\/p>\n<ul>\n<li>fjernelse af en kolonne<\/li>\n<li>\u00e6ndring af datatypen for en eksisterende kolonne (in place)<\/li>\n<li>omd\u00f8bning af kolonner, der kun adskiller sig i store og sm\u00e5 bogstaver (f.eks. \"Foo\" og \"foo\")<\/li>\n<\/ul>\n<p>\nEndelig vil den kommende udgivelse af Spark 3.0 fuldt ud underst\u00f8tte eksplicit DDL (ved hj\u00e6lp af ALTER TABLE), hvilket giver brugerne mulighed for at udf\u00f8re f\u00f8lgende handlinger p\u00e5 tabelskemaer:<\/p>\n<ul>\n<li>tilf\u00f8jelse af kolonner<\/li>\n<li>\u00e6ndring af kommentarer til kolonner<\/li>\n<li>justering af tabelens egenskaber, der bestemmer tabelens adf\u00e6rd, som f.eks. at indstille varigheden for opbevaring af transaktionsloggen.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Hvad er fordelene ved skemaets evolution?<\/h2>\n<p>\nSkemaets evolution kan anvendes, n\u00e5r du <i>har til hensigt<\/i> at \u00e6ndre skemaet for din tabel (modsat de tilf\u00e6lde, hvor du utilsigtet har tilf\u00f8jet kolonner til din DataFrame, som ikke burde v\u00e6re der). Dette er den nemmeste m\u00e5de at migrere dit skema p\u00e5, fordi det automatisk tilf\u00f8jer de korrekte kolonnenavne og datatyper uden behov for at erkl\u00e6re dem eksplicit.<\/p>\n<h2>Konklusion<\/h2>\n<p>\nTvangsm\u00e6ssig anvendelse af skemaet afviser eventuelle nye kolonner eller andre skema\u00e6ndringer, der ikke er kompatible med din tabel. Ved at fasts\u00e6tte og opretholde disse h\u00f8je standarder kan analytikere og ingeni\u00f8rer stole p\u00e5, at deres data har det h\u00f8jeste niveau af integritet, hvilket g\u00f8r det klart for dem at tr\u00e6ffe mere effektive forretningsbeslutninger.<\/p>\n<p>P\u00e5 den anden side supplerer skemaets evolution den tvangsm\u00e6ssige anvendelse, hvilket forenkler <i>forventede<\/i> automatiske skema\u00e6ndringer. I sidste ende burde det ikke v\u00e6re kompliceret at tilf\u00f8je en kolonne.<\/p>\n<p>Tvangsm\u00e6ssig anvendelse af skemaet er yang, hvor skemaets evolution er yin. N\u00e5r disse funktioner anvendes sammen, bliver det lettere end nogensinde at undertrykke st\u00f8j og justere signalet.<\/p>\n<p><i>Vi vil ogs\u00e5 gerne takke Mukul Murti og Pranav Anand for deres bidrag til denne artikel.<\/i><\/p>\n<p>Andre artikler i denne serie:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/21\/diving-into-delta-lake-unpacking-the-transaction-log.html\">Dyk ned i Delta Lake: Udpakning af transaktionsloggen<\/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=\"Afspil video\" 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>Relaterede artikler<\/h2>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/14\/productionizing-machine-learning-with-delta-lake.html\">Maskinl\u00e6ring p\u00e5 produktionsniveau med Delta Lake<\/a><\/noindex><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/discover\/data-lakes\/introduction\">Hvad er et datalake?<\/a><\/noindex><\/p>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/J1P5\/\">L\u00e6r mere om kurset<\/a><\/noindex><\/p>\n<p>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Dyk ned i Delta Lake: Tvangsm\u00e6ssig anvendelse og skemaets evolution | ProHoster","description":"Hello, Habr!","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/82038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=82038"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/82038\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/82039"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=82038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=82038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=82038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}