{"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\/nl\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy","title":{"rendered":"Diep duiken in Delta Lake: gedwongen toepassing en evolutie van schema's","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Hallo, Habr! Ik presenteer u de vertaling van het artikel <noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/09\/24\/diving-into-delta-lake-schema-enforcement-evolution.html\">\u00abDiving Into Delta Lake: Schema Enforcement &amp; Evolution\u00bb<\/a><\/noindex> van de auteurs Burak Yavuz, Brenner Heintz en Denny Lee, die is voorbereid ter gelegenheid van de start van de cursus <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/J1P5\/\">\u00abData Engineer\u00bb<\/a><\/noindex> van OTUS.<\/b><\/i><\/p>\n<p><img decoding=\"async\" alt=\"Diep duiken in Delta Lake: gedwongen toepassing en evolutie van schema&#039;s\" src=\"\/wp-content\/uploads\/2020\/05\/1d20921d8d4a1c1e0f8afee4fc019024.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Gegevens, net als onze ervaring, accumuleren en evolueren voortdurend. Om niet achter te blijven, moeten onze mentale modellen van de wereld zich aanpassen aan nieuwe gegevens, waarvan sommige nieuwe dimensies bevatten - nieuwe manieren om naar dingen te kijken waarvan we eerder geen idee hadden. Deze mentale modellen verschillen weinig van de schema's van tabellen, die defini\u00ebren hoe we nieuwe informatie classificeren en verwerken.<\/p>\n<p>Dit leidt ons tot de vraag van schema-beheer. Naarmate zakelijke taken en vereisten in de loop van de tijd veranderen, verandert ook de structuur van uw gegevens. Delta Lake maakt het eenvoudig om nieuwe dimensies in te voeren naarmate de gegevens veranderen. Gebruikers hebben toegang tot een eenvoudige semantiek voor het beheren van de schema's van hun tabellen. Deze tools omvatten schema-afdwinging (Schema Enforcement), die gebruikers beschermt tegen het onbedoeld vervuilen van hun tabellen met fouten of onnodige gegevens, evenals schema-evolutie (Schema Evolution), waarmee nieuwe kolommen met waardevolle gegevens automatisch op de juiste plaatsen kunnen worden toegevoegd. In dit artikel verdiepen we ons in het gebruik van deze tools.<\/p>\n<h2>Begrijpen van tabellschema's<\/h2>\n<p>\nElke DataFrame in Apache Spark bevat een schema dat de structuur van de gegevens bepaalt, zoals datatypes, kolommen en metadata. Met Delta Lake wordt het schema van de tabel opgeslagen in JSON-formaat binnen het transactiedagboek.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Wat is schema-afdwinging?<\/h2>\n<p>\nSchema-afdwinging (Schema Enforcement), ook wel schema-validatie (Schema Validation) genoemd, is een beschermingsmechanisme in Delta Lake dat de kwaliteit van gegevens garandeert door records die niet aan het schema van de tabel voldoen af te wijzen. Net als een hostess bij de receptie van een populair restaurant die alleen op reservering accepteert, controleert dit of elke kolom met gegevens die in de tabel wordt ingevoerd, op de bijbehorende lijst van verwachte kolommen staat (met andere woorden, of er voor elk daarvan een 'reservering' is), en wijst het alle records af met kolommen die niet op de lijst staan.<\/p>\n<h2>Hoe werkt schema-afdwinging?<\/h2>\n<p>\nDelta Lake gebruikt schema-controle bij het schrijven, wat betekent dat alle nieuwe records in de tabel worden gecontroleerd op compatibiliteit met het schema van de doeltabel tijdens het schrijven. Als het schema niet compatibel is, annuleert Delta Lake de transactie volledig (gegevens worden niet opgeslagen) en genereert het een uitzondering om de gebruiker te waarschuwen voor de inconsistentie.<br \/>\nOm de compatibiliteit van een record met de tabel te bepalen, gebruikt Delta Lake de volgende regels. Geschreven DataFrame:<\/p>\n<ul>\n<li>mag geen extra kolommen bevatten die niet in het schema van de doeltabel aanwezig zijn. Omgekeerd is het prima als de binnenkomende gegevens niet alle kolommen uit de tabel bevatten \u2014 deze kolommen krijgen gewoon null-waarden toegewezen.<\/li>\n<li>mag geen datatypes van kolommen hebben die verschillen van de datatypes van de kolommen in de doeltabel. Als een kolom in de doeltabel gegevens van het type StringType bevat, maar de overeenkomstige kolom in het DataFrame gegevens van het type IntegerType bevat, zal het afdwingen van het schema een uitzondering veroorzaken en de uitvoer van de schrijfoperatie blokkeren.<\/li>\n<li>mag geen kolomnamen bevatten die alleen in hoofdletters verschillen. Dit betekent dat je geen kolommen met de namen 'Foo' en 'foo' kunt hebben, gedefinieerd in dezelfde tabel. Hoewel Spark kan worden gebruikt in hoofdlettergevoelige of hoofdletterongevoelige modus (standaard), houdt Delta Lake de hoofdlettergevoeligheid aan, maar is hoofdletterongevoelig binnen het schema-opslag. Parquet is hoofdlettergevoelig bij het opslaan en retourneren van kolomgegevens. Om mogelijke fouten, datacorruptie of dataverlies (waar we persoonlijk mee te maken hebben gehad in Databricks) te voorkomen, hebben we besloten deze beperking toe te voegen.<\/li>\n<\/ul>\n<p>\nOm dit te illustreren, laten we eens kijken naar wat er gebeurt in de onderstaande code wanneer we proberen enkele recent gegenereerde kolommen toe te voegen aan een Delta Lake-tabel die nog niet is ingesteld om deze te accepteren.<\/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>\nIn plaats van automatisch nieuwe kolommen toe te voegen, handhaaft Delta Lake het schema en stopt het de schrijfoperatie. Om te helpen identificeren welke kolom (of meerdere) de oorzaak van de inconsistentie is, zal Spark beide schema's uit de stacktrace afdrukken voor vergelijking.<\/p>\n<h2>Wat is het voordeel van het afdwingen van het schema?<\/h2>\n<p>\nAangezien het afdwingen van een schema een strenge controle met zich meebrengt, is het een uitstekend instrument om te gebruiken als poortwachter voor een schone, volledig omgevormde dataset die klaar is voor productie of consumptie. Het wordt doorgaans toegepast op tabellen die gegevens direct aanbieden:<\/p>\n<ul>\n<li>Machine learning-algoritmen<\/li>\n<li>BI-dashboarden<\/li>\n<li>Gegevensanalyse en visualisatietools<\/li>\n<li>Elke productiesysteem dat strikte gestructureerde, strikt getypeerde semantische schema's vereist.<\/li>\n<\/ul>\n<p>\nOm uw gegevens voor deze laatste barri\u00e8re voor te bereiden, gebruiken veel gebruikers een eenvoudige \u2018multi-hop\u2019 architectuur die geleidelijk structuur in hun tabellen aanbrengt. Om hier meer over te leren, kunt u het artikel bekijken <noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/14\/productionizing-machine-learning-with-delta-lake.html\">Productieniveau machine learning met Delta Lake.<\/a><\/noindex><\/p>\n<p>Natuurlijk kan het afdwingen van een schema overal in uw pijplijn worden gebruikt, maar houd er rekening mee dat streamen naar een tabel in dat geval frustrerend kan zijn, vooral als u bent vergeten dat u een extra kolom aan de inkomende gegevens hebt toegevoegd.<\/p>\n<h2>Voorkomen van gegevensverdunning<\/h2>\n<p>\nTot dit moment vraagt u zich misschien af, waar is al deze ophef om te doen? Uiteindelijk kan een onverwachte \u2018schema mismatch\u2019-fout uw workflow verstoren, vooral als u nieuw bent bij Delta Lake. Waarom gewoon niet de schema laten veranderen zoals nodig is, zodat ik mijn DataFrame kan opslaan, ongeacht wat er gebeurt?<\/p>\n<p>Zoals het oude gezegde luidt: \u2018Een ons preventie is een pond genezing waard\u2019. Op een gegeven moment, als u niet voor uw schema zorgt, zullen typecompatibiliteitsproblemen hun lelijke kop opsteken - ogenschijnlijk homogene bronnen van ruwe gegevens kunnen randgevallen, beschadigde kolommen, verkeerd geconfigureerde mappings of andere vreselijke dingen bevatten die in nachtmerries opduiken. De beste benadering is om deze vijanden bij de poort te stoppen - door middel van schema-afdwingen - en ermee om te gaan in het licht, in plaats van later, wanneer ze beginnen rond te neuzen in de donkere diepten van uw werkcode.<\/p>\n<p>Het afdwingen van een schema geeft de zekerheid dat het schema van uw tabel niet verandert, tenzij u zelf een wijzigingsoptie bevestigt. Dit voorkomt het 'verdunnen' van gegevens, wat kan gebeuren wanneer nieuwe kolommen zo vaak worden toegevoegd dat ooit waardevolle, gecomprimeerde tabellen hun betekenis en nut verliezen door een overvloed aan gegevens. Door u aan te moedigen om doelbewust te zijn, hoge standaarden te stellen en hoge kwaliteit te verwachten, doet het afdwingen van het schema precies waarvoor het bedoeld is: u helpen integer te blijven en uw tabellen schoon.<\/p>\n<p>Als u bij verdere overweging beslist dat u eigenlijk <i>moet<\/i> een nieuwe kolom wilt toevoegen, geen probleem, hieronder staat een eenregelige oplossing. De oplossing is schema-evolutie!<\/p>\n<h2>Wat is schema-evolutie?<\/h2>\n<p>\nSchema-evolutie is een functie die gebruikers in staat stelt om de huidige tabelstructuur eenvoudig te wijzigen op basis van gegevens die in de loop der tijd veranderen. Het wordt het vaakst gebruikt tijdens een toevoeging of herschrijfoperatie om automatisch het schema aan te passen voor \u00e9\u00e9n of meerdere nieuwe kolommen.<\/p>\n<h2>Hoe werkt schema-evolutie?<\/h2>\n<p>\nDoor het voorbeeld uit de vorige sectie te volgen, kunnen ontwikkelaars schema-evolutie eenvoudig gebruiken om nieuwe kolommen toe te voegen die eerder waren afgewezen vanwege schema-inconsistenties. Schema-evolutie wordt geactiveerd door <code>.option('mergeSchema', 'true')<\/code> toe te voegen aan uw Spark-opdracht <code>.write of .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>\nVoer de volgende Spark SQL-query uit om de grafiek te bekijken<\/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=\"Diep duiken in Delta Lake: gedwongen toepassing en evolutie van schema&#039;s\" src=\"\/wp-content\/uploads\/2020\/05\/873ce67da00f69696d5b9328bd90793a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAls alternatief kunt u deze optie instellen voor de gehele Spark-sessie door <code>spark.databricks.delta.schema.autoMerge = True<\/code> toe te voegen aan de Spark-configuratie. Maar wees voorzichtig, want als u schema afdwingt, ontvangt u geen waarschuwingen meer over onopzettelijke schema-inconsistenties.<\/p>\n<p>Door in de query de parameter <code>mergeSchema<\/code>toe te voegen, worden alle kolommen die in de DataFrame aanwezig zijn maar ontbreken in de doeltabel automatisch aan het einde van het schema toegevoegd binnen de schrijfactie. Ook geneste velden kunnen worden toegevoegd, en zij worden ook aan het einde van de bijbehorende kolommen in de structuur toegevoegd.<\/p>\n<p>Data-engineers en wetenschappers kunnen deze functie gebruiken om nieuwe kolommen toe te voegen (mogelijk een recent bijgehouden metriek of een kolom met verkoopcijfers van deze maand) aan hun bestaande machine learning-productietabellen, zonder de bestaande modellen die op oude kolommen zijn gebaseerd te verstoren. <\/p>\n<p>De volgende soorten schema wijzigingen zijn toegestaan in het kader van schema evolutie tijdens het toevoegen of overschrijven van een tabel:<\/p>\n<ul>\n<li>Nieuwe kolommen toevoegen (dit is het meest voorkomende scenario)<\/li>\n<li>Wijzigen van datatypes van NullType -&gt; elk ander type of verhogen van ByteType -&gt; ShortType -&gt; IntegerType<\/li>\n<\/ul>\n<p>\nAndere wijzigingen die niet zijn toegestaan in het kader van schema evolutie vereisen dat het schema en de gegevens worden overschreven door het toevoegen <code>.option(\"overwriteSchema\", \"true\")<\/code>. Bijvoorbeeld, in het geval dat de kolom \"Foo\" oorspronkelijk een integer was en het nieuwe schema van string datatype zou zijn, dan moesten alle Parquet-bestanden (data) worden overschreven. Dergelijke wijzigingen zijn:<\/p>\n<ul>\n<li>verwijderen van een kolom<\/li>\n<li>wijzigen van het datatype van een bestaande kolom (op locatie)<\/li>\n<li>hernoemen van kolommen die alleen qua hoofdletters verschillen (bijvoorbeeld \"Foo\" en \"foo\")<\/li>\n<\/ul>\n<p>\nTen slotte zal met de volgende release van Spark 3.0 expliciete DDL (met gebruik van ALTER TABLE) volledig worden ondersteund, waardoor gebruikers de volgende acties op tabelschema's kunnen uitvoeren:<\/p>\n<ul>\n<li>kolommen toevoegen<\/li>\n<li>commentaren van kolommen wijzigen<\/li>\n<li>instellen van de tabel eigenschappen die het gedrag van de tabel bepalen, zoals het instellen van de bewaartermijn voor het transactie log.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Wat zijn de voordelen van schema evolutie?<\/h2>\n<p>\nSchema evolutie kan altijd worden gebruikt wanneer u <i>van plan bent<\/i> het schema van uw tabel te wijzigen (in tegenstelling tot wanneer u per ongeluk kolommen aan uw DataFrame toevoegt die daar niet in thuishoren). Het is de eenvoudigste manier om uw schema te migreren, omdat het automatisch de juiste kolomnamen en datatypes toevoegt zonder dat expliciete declaratie nodig is.<\/p>\n<h2>Conclusie<\/h2>\n<p>\nDwingende toepassing van het schema wijst nieuwe kolommen of andere schemawijzigingen af die niet compatibel zijn met uw tabel. Door deze hoge normen vast te stellen en te handhaven, kunnen analisten en ingenieurs erop vertrouwen dat hun gegevens de hoogste integriteit hebben, wat hen in staat stelt om effectievere zakelijke beslissingen te nemen.<\/p>\n<p>Aan de andere kant completeert de evolutie van het schema de dwingende toepassing en vereenvoudigt het <i>vermoedelijke<\/i> automatische schemawijzigingen. Tenslotte zou het geen complicatie moeten zijn \u2014 een kolom toevoegen.<\/p>\n<p>Dwingende toepassing van het schema is yang, terwijl de evolutie van het schema yin is. Samen zorgen deze functies ervoor dat het onderdrukken van ruis en het afstemmen van het signaal eenvoudiger is dan ooit.<\/p>\n<p><i>We willen ook Mukul Murty en Pranav Anand bedanken voor hun bijdrage aan dit artikel.<\/i><\/p>\n<p>Andere artikelen in deze 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\">Diepgaand in Delta Lake: uitpakken van het transactie-log<\/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=\"Video afspelen\" 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>Artikelen over dit onderwerp<\/h2>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/14\/productionizing-machine-learning-with-delta-lake.html\">Productieklare machine learning met Delta Lake<\/a><\/noindex><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/discover\/data-lakes\/introduction\">Wat is een data lake?<\/a><\/noindex><\/p>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/J1P5\/\">Meer leren over de cursus<\/a><\/noindex><\/p>\n<p>Bron: <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\/nl\/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=\"nl_NL\" \/>\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\/nl\/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\udd47Diepgaand in Delta Lake: dwingende toepassing en evolutie van het schema | ProHoster","description":"Hallo, Habr!","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/82038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=82038"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/82038\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/82039"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=82038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=82038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=82038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}