{"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\/fr\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy","title":{"rendered":"Plong\u00e9e dans Delta Lake : application stricte et \u00e9volution du sch\u00e9ma","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Bonjour Habr ! Je vous pr\u00e9sente la traduction de l'article <noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/09\/24\/diving-into-delta-lake-schema-enforcement-evolution.html\">\u00abPlong\u00e9e dans Delta Lake : Application et \u00c9volution des Sch\u00e9mas\u00bb<\/a><\/noindex> des auteurs Burak Yavuz, Brenner Heintz et Denny Lee, pr\u00e9par\u00e9 en vue du lancement du cours <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/J1P5\/\">\u00abIng\u00e9nieur en donn\u00e9es\u00bb<\/a><\/noindex> d'OTUS.<\/b><\/i><\/p>\n<p><img decoding=\"async\" alt=\"Plong\u00e9e dans Delta Lake : application stricte et \u00e9volution du sch\u00e9ma\" src=\"\/wp-content\/uploads\/2020\/05\/1d20921d8d4a1c1e0f8afee4fc019024.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Les donn\u00e9es, tout comme notre exp\u00e9rience, s'accumulent et se d\u00e9veloppent constamment. Pour ne pas rester en arri\u00e8re, nos mod\u00e8les mentaux du monde doivent s'adapter aux nouvelles donn\u00e9es, certaines d'entre elles contenant de nouvelles dimensions - de nouvelles fa\u00e7ons d'observer des choses dont nous n'avions pas auparavant connaissance. Ces mod\u00e8les mentaux ne diff\u00e8rent gu\u00e8re des sch\u00e9mas de tables qui d\u00e9finissent comment nous classifions et traitons les nouvelles informations.<\/p>\n<p>Cela nous am\u00e8ne \u00e0 la question de la gestion des sch\u00e9mas. \u00c0 mesure que les besoins et les exigences des entreprises \u00e9voluent avec le temps, la structure de vos donn\u00e9es change \u00e9galement. Delta Lake permet d'introduire facilement de nouvelles dimensions lors de la modification des donn\u00e9es. Les utilisateurs ont acc\u00e8s \u00e0 une s\u00e9mantique simple pour g\u00e9rer les sch\u00e9mas de leurs tables. Ces outils incluent l'application forc\u00e9e des sch\u00e9mas (Schema Enforcement), qui prot\u00e8ge les utilisateurs d'une contamination accidentelle de leurs tables par des erreurs ou des donn\u00e9es inutiles, ainsi que l'\u00e9volution des sch\u00e9mas (Schema Evolution), qui permet d'ajouter automatiquement de nouvelles colonnes avec des donn\u00e9es pr\u00e9cieuses aux emplacements appropri\u00e9s. Dans cet article, nous allons approfondir l'utilisation de ces outils.<\/p>\n<h2>Compr\u00e9hension des sch\u00e9mas de table<\/h2>\n<p>\nChaque DataFrame dans Apache Spark contient un sch\u00e9ma qui d\u00e9finit la forme des donn\u00e9es, tels que les types de donn\u00e9es, les colonnes et les m\u00e9tadonn\u00e9es. Avec Delta Lake, le sch\u00e9ma de la table est conserv\u00e9 au format JSON dans le journal des transactions.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Qu'est-ce que l'application forc\u00e9e des sch\u00e9mas ?<\/h2>\n<p>\nL'application forc\u00e9e des sch\u00e9mas (Schema Enforcement), \u00e9galement connue sous le nom de validation des sch\u00e9mas (Schema Validation), est un m\u00e9canisme de protection dans Delta Lake qui garantit la qualit\u00e9 des donn\u00e9es en rejetant les enregistrements qui ne correspondent pas au sch\u00e9ma de la table. Tout comme une h\u00f4tesse \u00e0 la r\u00e9ception d'un restaurant populaire qui n'accepte que les r\u00e9servations, elle v\u00e9rifie si chaque colonne de donn\u00e9es saisie dans la table figure sur la liste des colonnes attendues (en d'autres termes, si chacune d'elles a une \u00ab r\u00e9servation \u00bb), et rejette tous les enregistrements avec des colonnes qui ne figurent pas sur cette liste.<\/p>\n<h2>Comment fonctionne l'application forc\u00e9e des sch\u00e9mas ?<\/h2>\n<p>\nDelta Lake utilise un contr\u00f4le de sch\u00e9ma lors de l'\u00e9criture, ce qui signifie que toutes les nouvelles entr\u00e9es dans la table sont v\u00e9rifi\u00e9es pour leur compatibilit\u00e9 avec le sch\u00e9ma de la table cible au moment de l'\u00e9criture. Si le sch\u00e9ma n'est pas compatible, Delta Lake annule compl\u00e8tement la transaction (les donn\u00e9es ne sont pas \u00e9crites) et g\u00e9n\u00e8re une exception pour informer l'utilisateur de l'incompatibilit\u00e9.<br \/>\nPour d\u00e9terminer la compatibilit\u00e9 d'une entr\u00e9e avec la table, Delta Lake utilise les r\u00e8gles suivantes. DataFrame \u00e0 \u00e9crire :<\/p>\n<ul>\n<li>ne peut pas contenir des colonnes suppl\u00e9mentaires qui ne figurent pas dans le sch\u00e9ma de la table cible. En revanche, il est acceptable que les donn\u00e9es entrantes ne contiennent pas toutes les colonnes de la table \u2014 ces colonnes se verront simplement attribuer des valeurs nulles.<\/li>\n<li>ne peut pas avoir des types de donn\u00e9es de colonnes qui diff\u00e8rent de ceux des colonnes de la table cible. Si une colonne de la table cible contient des donn\u00e9es de type StringType, mais que la colonne correspondante dans le DataFrame contient des donn\u00e9es de type IntegerType, l'application forc\u00e9e du sch\u00e9ma g\u00e9n\u00e9rera une exception et emp\u00eachera l'op\u00e9ration d'\u00e9criture.<\/li>\n<li>ne peut pas contenir des noms de colonnes qui ne diff\u00e8rent que par la casse. Cela signifie que vous ne pouvez pas avoir des colonnes nomm\u00e9es 'Foo' et 'foo' d\u00e9finies dans une m\u00eame table. Bien que Spark puisse \u00eatre utilis\u00e9 en mode sensible ou insensible (par d\u00e9faut) \u00e0 la casse, Delta Lake conserve la casse mais est insensible lors du stockage du sch\u00e9ma. Parquet est sensible \u00e0 la casse lors du stockage et du renvoi des informations de colonne. Pour \u00e9viter d'\u00e9ventuelles erreurs, des corruptions de donn\u00e9es ou des pertes (ce que nous avons personnellement rencontr\u00e9 dans Databricks), nous avons d\u00e9cid\u00e9 d'ajouter cette restriction.<\/li>\n<\/ul>\n<p>\nPour illustrer cela, examinons ce qui se passe dans le code ci-dessous lorsque nous tentons d'ajouter certaines colonnes nouvellement g\u00e9n\u00e9r\u00e9es \u00e0 une table Delta Lake qui n'est pas encore configur\u00e9e pour les accepter.<\/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>\nAu lieu d'ajouter automatiquement de nouvelles colonnes, Delta Lake impose le sch\u00e9ma et arr\u00eate l'\u00e9criture. Pour aider \u00e0 identifier quelle colonne (ou lesquelles) sont \u00e0 l'origine de l'incompatibilit\u00e9, Spark affiche les deux sch\u00e9mas de la trace de pile pour comparaison.<\/p>\n<h2>Quel est l'avantage d'une application de sch\u00e9ma forc\u00e9e ?<\/h2>\n<p>\nPuisque l'application stricte du sch\u00e9ma repr\u00e9sente un contr\u00f4le rigoureux, elle constitue un excellent outil pour servir de passerelle \u00e0 un ensemble de donn\u00e9es propre, enti\u00e8rement transform\u00e9, pr\u00eat pour la production ou la consommation. En g\u00e9n\u00e9ral, elle s'applique aux tables qui fournissent directement des donn\u00e9es :<\/p>\n<ul>\n<li>Aux algorithmes d'apprentissage automatique<\/li>\n<li>Aux tableaux de bord BI<\/li>\n<li>\u00c0 l'analyse des donn\u00e9es et aux outils de visualisation<\/li>\n<li>\u00c0 tout syst\u00e8me de production n\u00e9cessitant des sch\u00e9mas s\u00e9mantiques strictement structur\u00e9s et typ\u00e9s.<\/li>\n<\/ul>\n<p>\nPour pr\u00e9parer vos donn\u00e9es \u00e0 cette barri\u00e8re finale, de nombreux utilisateurs adoptent une architecture simple de \u00ab multi-hop \u00bb qui apporte progressivement de la structure \u00e0 leurs tables. Pour en savoir plus \u00e0 ce sujet, vous pouvez consulter l'article <noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/14\/productionizing-machine-learning-with-delta-lake.html\">L'apprentissage automatique de niveau production avec Delta Lake.<\/a><\/noindex><\/p>\n<p>\u00c9videmment, l'application stricte du sch\u00e9ma peut \u00eatre utilis\u00e9e \u00e0 n'importe quel endroit de votre pipeline, mais gardez \u00e0 l'esprit que l'\u00e9criture en continu dans une table peut \u00eatre frustrante, par exemple, si vous oubliez que vous avez ajout\u00e9 une colonne suppl\u00e9mentaire dans les donn\u00e9es d'entr\u00e9e.<\/p>\n<h2>Pr\u00e9vention de l'\u00e9clatement des donn\u00e9es<\/h2>\n<p>\n\u00c0 ce stade, vous pourriez vous demander pourquoi un tel engouement ? Apr\u00e8s tout, parfois une erreur inattendue de \u00ab non-conformit\u00e9 du sch\u00e9ma \u00bb peut vous faire tr\u00e9bucher dans votre flux de travail, surtout si vous \u00eates novice avec Delta Lake. Pourquoi ne pas simplement laisser le sch\u00e9ma \u00e9voluer comme il faut pour que je puisse enregistrer mon DataFrame, quoi qu'il arrive ?<\/p>\n<p>Comme le dit un vieux dicton, \u00ab une once de pr\u00e9vention vaut une livre de gu\u00e9rison \u00bb. \u00c0 un certain moment, si vous ne vous occupez pas d'appliquer votre sch\u00e9ma, des probl\u00e8mes de compatibilit\u00e9 des types de donn\u00e9es pointeront leur vilain nez \u2014 des sources de donn\u00e9es brutes apparemment homog\u00e8nes peuvent contenir des cas limites, des colonnes corrompues, des mappings mal form\u00e9s ou d'autres horreurs qui hantent vos cauchemars. La meilleure approche consiste \u00e0 arr\u00eater ces ennemis aux portes \u2014 gr\u00e2ce \u00e0 l'application stricte du sch\u00e9ma \u2014 et \u00e0 les affronter \u00e0 la lumi\u00e8re, plut\u00f4t que plus tard, lorsqu'ils commenceront \u00e0 r\u00f4der dans les profondeurs obscures de votre code de travail.<\/p>\n<p>L'application forc\u00e9e du sch\u00e9ma assure que la structure de votre table ne changera pas, sauf si vous validez vous-m\u00eame un changement. Cela pr\u00e9vient la \u00ab dilution \u00bb des donn\u00e9es, qui peut se produire lorsque de nouvelles colonnes sont ajout\u00e9es si souvent que des tables auparavant pr\u00e9cieuses et compactes perdent leur signification et leur utilit\u00e9 \u00e0 cause d'un exc\u00e8s de donn\u00e9es. En vous encourageant \u00e0 \u00eatre intentionnel, \u00e0 \u00e9tablir des normes \u00e9lev\u00e9es et \u00e0 attendre une grande qualit\u00e9, l'application forc\u00e9e du sch\u00e9ma remplit exactement son r\u00f4le - vous aider \u00e0 rester honn\u00eate et \u00e0 garder vos tables nettes.<\/p>\n<p>Si, apr\u00e8s un examen approfondi, vous d\u00e9cidez que vous souhaitez r\u00e9ellement <i>doit<\/i> ajouter une nouvelle colonne, pas de probl\u00e8me, voici un correctif en une ligne. La solution est l'\u00e9volution du sch\u00e9ma !<\/p>\n<h2>Qu'est-ce que l'\u00e9volution du sch\u00e9ma ?<\/h2>\n<p>\nL'\u00e9volution du sch\u00e9ma est une fonctionnalit\u00e9 qui permet aux utilisateurs de modifier facilement la structure actuelle d'une table en fonction des donn\u00e9es qui changent au fil du temps. Elle est le plus souvent utilis\u00e9e lors de l'ajout ou de la r\u00e9\u00e9criture d'op\u00e9rations pour adapter automatiquement le sch\u00e9ma \u00e0 l'inclusion d'une ou plusieurs nouvelles colonnes.<\/p>\n<h2>Comment fonctionne l'\u00e9volution du sch\u00e9ma ?<\/h2>\n<p>\nEn suivant l'exemple de la section pr\u00e9c\u00e9dente, les d\u00e9veloppeurs peuvent facilement utiliser l'\u00e9volution du sch\u00e9ma pour ajouter de nouvelles colonnes qui ont \u00e9t\u00e9 pr\u00e9alablement rejet\u00e9es en raison d'un non-respect du sch\u00e9ma. L'\u00e9volution du sch\u00e9ma est activ\u00e9e en ajoutant <code>.option('mergeSchema', 'true')<\/code> \u00e0 votre commande Spark <code>.write ou .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>\nPour voir le diagramme, ex\u00e9cutez la requ\u00eate SQL Spark suivante<\/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=\"Plong\u00e9e dans Delta Lake : application stricte et \u00e9volution du sch\u00e9ma\" src=\"\/wp-content\/uploads\/2020\/05\/873ce67da00f69696d5b9328bd90793a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAlternativement, vous pouvez d\u00e9finir cette option pour toute la session Spark en ajoutant <code>spark.databricks.delta.schema.autoMerge = True<\/code> dans la configuration Spark. Mais utilisez-le avec pr\u00e9caution, car l'application forc\u00e9e du sch\u00e9ma ne vous avertira plus des incoh\u00e9rences involontaires avec le sch\u00e9ma.<\/p>\n<p>En ajoutant le param\u00e8tre \u00e0 la requ\u00eate <code>mergeSchema<\/code>, toutes les colonnes pr\u00e9sentes dans le DataFrame mais absentes de la table cible sont automatiquement ajout\u00e9es \u00e0 la fin du sch\u00e9ma dans le cadre de la transaction d'\u00e9criture. Des champs imbriqu\u00e9s peuvent \u00e9galement \u00eatre ajout\u00e9s, et ils seront \u00e9galement ajout\u00e9s \u00e0 la fin des colonnes correspondantes de la structure.<\/p>\n<p>Les ing\u00e9nieurs et les scientifiques peuvent utiliser cette option pour ajouter de nouvelles colonnes (peut-\u00eatre une m\u00e9trique r\u00e9cemment suivie ou une colonne des ventes de ce mois-ci) \u00e0 leurs tableaux de production en apprentissage automatique existants, sans perturber les mod\u00e8les existants bas\u00e9s sur les anciennes colonnes. <\/p>\n<p>Les types de modifications de sch\u00e9ma suivants sont autoris\u00e9s dans le cadre de l'\u00e9volution du sch\u00e9ma lors de l'ajout ou de la r\u00e9\u00e9criture d'une table :<\/p>\n<ul>\n<li>Ajout de nouvelles colonnes (c'est le sc\u00e9nario le plus courant)<\/li>\n<li>Changement de types de donn\u00e9es de NullType -&gt; tout autre type ou \u00e9l\u00e9vation de ByteType -&gt; ShortType -&gt; IntegerType<\/li>\n<\/ul>\n<p>\nD'autres modifications non autoris\u00e9es dans le cadre de l'\u00e9volution du sch\u00e9ma n\u00e9cessitent que le sch\u00e9ma et les donn\u00e9es soient r\u00e9\u00e9crits en ajoutant <code>.option(\"overwriteSchema\", \"true\")<\/code>. Par exemple, dans le cas o\u00f9 la colonne \u00ab Foo \u00bb \u00e9tait initialement un entier, et que le nouveau sch\u00e9ma serait d'un type de donn\u00e9es cha\u00eene, alors tous les fichiers Parquet (donn\u00e9es) devraient \u00eatre r\u00e9\u00e9crits. Ces modifications comprennent :<\/p>\n<ul>\n<li>la suppression d'une colonne<\/li>\n<li>le changement de type de donn\u00e9es d'une colonne existante (sur place)<\/li>\n<li>le renommage des colonnes qui ne diff\u00e8rent que par leur casse (par exemple, \u00ab Foo \u00bb et \u00ab foo \u00bb)<\/li>\n<\/ul>\n<p>\nEnfin, avec la prochaine version de Spark 3.0, le DDL explicite (en utilisant ALTER TABLE) sera enti\u00e8rement support\u00e9, permettant aux utilisateurs d'effectuer les op\u00e9rations suivantes sur les sch\u00e9mas de table :<\/p>\n<ul>\n<li>ajout de colonnes<\/li>\n<li>changement de commentaires sur les colonnes<\/li>\n<li>configuration des propri\u00e9t\u00e9s de la table d\u00e9finissant le comportement de la table, par exemple, la d\u00e9finition de la dur\u00e9e de conservation du journal des transactions.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Quel est l'avantage de l'\u00e9volution du sch\u00e9ma ?<\/h2>\n<p>\nL'\u00e9volution du sch\u00e9ma peut \u00eatre utilis\u00e9e chaque fois que vous <i>pr\u00e9voyez<\/i> modifier le sch\u00e9ma de votre table (contrairement aux cas o\u00f9 vous avez accidentellement ajout\u00e9 des colonnes \u00e0 votre DataFrame qui ne devraient pas y \u00eatre). C'est le moyen le plus simple de migrer votre sch\u00e9ma, car il ajoute automatiquement les bons noms de colonnes et types de donn\u00e9es sans besoin de les d\u00e9clarer explicitement.<\/p>\n<h2>Conclusion<\/h2>\n<p>\nL'application forc\u00e9e du sch\u00e9ma rejette toute nouvelle colonne ou autre modification de sch\u00e9ma qui n'est pas compatible avec votre table. En \u00e9tablissant et en maintenant ces normes \u00e9lev\u00e9es, les analystes et les ing\u00e9nieurs peuvent s'appuyer sur le fait que leurs donn\u00e9es ont un niveau d'int\u00e9grit\u00e9 exceptionnel, leur permettant de r\u00e9fl\u00e9chir clairement et de prendre des d\u00e9cisions commerciales plus efficaces.<\/p>\n<p>D'un autre c\u00f4t\u00e9, l'\u00e9volution du sch\u00e9ma compl\u00e8te l'application forc\u00e9e, simplifiant <i>les modifications<\/i> automatiques du sch\u00e9ma. En fin de compte, cela ne doit pas \u00eatre compliqu\u00e9 \u2014 ajouter une colonne.<\/p>\n<p>L'application forc\u00e9e du sch\u00e9ma est le yang, tandis que l'\u00e9volution du sch\u00e9ma est le yin. Lorsqu'elles sont utilis\u00e9es ensemble, ces fonctionnalit\u00e9s simplifient plus que jamais la suppression du bruit et l'ajustement du signal.<\/p>\n<p><i>Nous tenons \u00e9galement \u00e0 remercier Mukul Murti et Pranav Anand pour leur contribution \u00e0 cet article.<\/i><\/p>\n<p>D'autres articles de cette s\u00e9rie :<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/21\/diving-into-delta-lake-unpacking-the-transaction-log.html\">Plong\u00e9e dans Delta Lake : d\u00e9ballage du journal des transactions<\/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=\"Lire la vid\u00e9o\" 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>Articles connexes<\/h2>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/14\/productionizing-machine-learning-with-delta-lake.html\">Apprentissage automatique de niveau production avec Delta Lake<\/a><\/noindex><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/discover\/data-lakes\/introduction\">Qu'est-ce qu'un lac de donn\u00e9es ?<\/a><\/noindex><\/p>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/J1P5\/\">En savoir plus sur le cours<\/a><\/noindex><\/p>\n<p>Source : <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.2 - 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\/fr\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Plong\u00e9e dans Delta Lake : application forc\u00e9e et \u00e9volution du sch\u00e9ma | ProHoster","description":"Salut, Habr !","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/82038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=82038"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/82038\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/82039"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=82038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=82038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=82038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}