{"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\/de\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy","title":{"rendered":"Eintauchen in Delta Lake: Schema-Zwang und -Entwicklung","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Hallo, Habr! Ich pr\u00e4sentiere Ihnen eine \u00dcbersetzung des Artikels. <noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/09\/24\/diving-into-delta-lake-schema-enforcement-evolution.html\">\u00abEintauchen in Delta Lake: Schema-Durchsetzung &amp; Evolution\u00bb<\/a><\/noindex> der Autoren Burak Yavuz, Brenner Heintz und Denny Lee, der im Vorfeld des Kursstarts vorbereitet wurde <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/J1P5\/\">\u201eData Engineer\u201c<\/a><\/noindex> von OTUS berichten werden.<\/b><\/i><\/p>\n<p><img decoding=\"async\" alt=\"Eintauchen in Delta Lake: Schema-Zwang und -Entwicklung\" src=\"\/wp-content\/uploads\/2020\/05\/1d20921d8d4a1c1e0f8afee4fc019024.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Daten, wie auch unsere Erfahrung, sammeln sich st\u00e4ndig an und entwickeln sich weiter. Um nicht zur\u00fcckzufallen, m\u00fcssen unsere mentalen Modelle der Welt an die neuen Daten angepasst werden, von denen einige neue Dimensionen enthalten \u2014 neue Wege, Dinge zu betrachten, von denen wir zuvor keine Vorstellung hatten. Diese mentalen Modelle unterscheiden sich kaum von den Schemas von Tabellen, die definieren, wie wir neue Informationen klassifizieren und verarbeiten.<\/p>\n<p>Das f\u00fchrt uns zur Frage der Schema-Verwaltung. W\u00e4hrend sich Gesch\u00e4ftsanforderungen und -fragen im Laufe der Zeit \u00e4ndern, \u00e4ndert sich auch die Struktur Ihrer Daten. Delta Lake erm\u00f6glicht es, neue Dimensionen einfach zu implementieren, wenn sich die Daten \u00e4ndern. Die Nutzer haben Zugang zu einfacher Semantik zur Verwaltung der Schemata ihrer Tabellen. Diese Werkzeuge umfassen die forcierte Anwendung von Schemata (Schema Enforcement), die die Nutzer vor unbeabsichtigter Verunreinigung ihrer Tabellen durch Fehler oder unerw\u00fcnschte Daten sch\u00fctzt, sowie die Schema-Evolution (Schema Evolution), die es erm\u00f6glicht, automatisch neue Spalten mit wertvollen Daten an den entsprechenden Stellen hinzuzuf\u00fcgen. In diesem Artikel werden wir uns eingehender mit der Verwendung dieser Werkzeuge befassen.<\/p>\n<h2>Verst\u00e4ndnis der Tabellenschemata<\/h2>\n<p>\nJeder DataFrame in Apache Spark enth\u00e4lt ein Schema, das die Struktur der Daten definiert, wie Datentypen, Spalten und Metadaten. Mit Delta Lake wird das Tabellenschema im JSON-Format innerhalb des Transaktionsprotokolls gespeichert.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Was ist die forcierte Anwendung von Schemata?<\/h2>\n<p>\nDie forcierte Anwendung von Schemata (Schema Enforcement), auch bekannt als Schema-Validierung (Schema Validation), ist ein Schutzmechanismus in Delta Lake, der die Datenqualit\u00e4t gew\u00e4hrleistet, indem er Aufzeichnungen ablehnt, die nicht mit dem Tabellenschema \u00fcbereinstimmen. \u00c4hnlich wie eine Hostess am Empfang in einem beliebten Restaurant, die nur Reservierungen annimmt, \u00fcberpr\u00fcft sie, ob jede Spalte von Daten, die in die Tabelle eingegeben werden, in der entsprechenden Liste der erwarteten Spalten enthalten ist (mit anderen Worten, ob f\u00fcr jede von ihnen eine 'Reservierung' besteht) und lehnt alle Aufzeichnungen mit Spalten ab, die nicht auf der Liste stehen.<\/p>\n<h2>Wie funktioniert die forcierte Anwendung von Schemata?<\/h2>\n<p>\nDelta Lake verwendet beim Schreiben eine Schema\u00fcberpr\u00fcfung, was bedeutet, dass alle neuen Eintr\u00e4ge in die Tabelle w\u00e4hrend des Schreibvorgangs auf die Kompatibilit\u00e4t mit dem Schema der Zieltabelle \u00fcberpr\u00fcft werden. Wenn das Schema inkompatibel ist, wird die Transaktion von Delta Lake vollst\u00e4ndig r\u00fcckg\u00e4ngig gemacht (Daten werden nicht geschrieben) und eine Ausnahme generiert, um den Benutzer auf die Inkompatibilit\u00e4t hinzuweisen.<br \/>\nZur Bestimmung der Kompatibilit\u00e4t eines Eintrags verwendet Delta Lake die folgenden Regeln. Der zu schreibende DataFrame:<\/p>\n<ul>\n<li>darf keine zus\u00e4tzlichen Spalten enthalten, die im Schema der Zieltabelle nicht vorhanden sind. Umgekehrt ist es in Ordnung, wenn die Eingabedaten nicht alle Spalten aus der Tabelle enthalten \u2013 diesen Spalten werden einfach Nullwerte zugewiesen.<\/li>\n<li>darf keine Datentypen von Spalten haben, die von den Datentypen der Spalten in der Zieltabelle abweichen. Wenn eine Spalte der Zieltabelle Daten des Typs StringType enth\u00e4lt, die entsprechende Spalte im DataFrame jedoch Daten des Typs IntegerType hat, l\u00f6st die erzwingende Anwendung des Schemas eine Ausnahme aus und verhindert die Ausf\u00fchrung des Schreibvorgangs.<\/li>\n<li>Darf keine Spaltennamen enthalten, die sich nur in der Gro\u00df- und Kleinschreibung unterscheiden. Das bedeutet, dass Sie in einer Tabelle keine Spalten mit den Namen 'Foo' und 'foo' haben k\u00f6nnen. Obwohl Spark im sensitiven oder nicht-sensitiven (Standard) Modus verwendet werden kann, beh\u00e4lt Delta Lake die Gro\u00df- und Kleinschreibung bei, ist jedoch beim Speichern des Schemas nicht sensitiver. Parquet ist empfindlich gegen\u00fcber Gro\u00df- und Kleinschreibung beim Speichern und Abrufen von Spalteninformationen. Um m\u00f6gliche Fehler, Datenbesch\u00e4digungen oder -verluste zu vermeiden (mit denen wir pers\u00f6nlich in Databricks konfrontiert waren), haben wir uns entschlossen, diese Einschr\u00e4nkung hinzuzuf\u00fcgen.<\/li>\n<\/ul>\n<p>\nUm dies zu veranschaulichen, schauen wir uns an, was im folgenden Code passiert, wenn versucht wird, einige neu generierte Spalten zu einer Delta Lake-Tabelle hinzuzuf\u00fcgen, die noch nicht f\u00fcr deren Annahme konfiguriert ist.<\/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>\nAnstelle des automatischen Hinzuf\u00fcgens neuer Spalten erzwingt Delta Lake das Schema und stoppt das Schreiben. Um zu helfen, den Spalte (oder mehrere) zu bestimmen, die die Inkompatibilit\u00e4t verursacht, gibt Spark beide Schemata aus dem Stacktrace zur Vergleichszwecken aus.<\/p>\n<h2>Was ist der Nutzen der erzwingenden Anwendung eines Schemas?<\/h2>\n<p>\nDa die erzwungene Anwendung von Schemata eine recht strenge \u00dcberpr\u00fcfung darstellt, ist sie ein ausgezeichnetes Werkzeug, um einen sauberen, vollst\u00e4ndig transformierten Datensatz zu erhalten, der bereit f\u00fcr die Produktion oder den Verbrauch ist. In der Regel wird sie auf Tabellen angewendet, die Daten direkt bereitstellen:<\/p>\n<ul>\n<li>Maschinenlernalgorithmen<\/li>\n<li>BI-Dashboards<\/li>\n<li>Datenanalyse und Visualisierungstools<\/li>\n<li>Jedes Produktionssystem, das strikt strukturierte, streng typisierte semantische Schemata erfordert.<\/li>\n<\/ul>\n<p>\nUm Ihre Daten auf diese finale H\u00fcrde vorzubereiten, verwenden viele Anwender eine einfache \"Multi-Hop\"-Architektur, die schrittweise Struktur in ihre Tabellen bringt. Um mehr dar\u00fcber zu erfahren, k\u00f6nnen Sie den Artikel <noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/14\/productionizing-machine-learning-with-delta-lake.html\">Produktionsreifes maschinelles Lernen mit Delta Lake.<\/a><\/noindex><\/p>\n<p>Nat\u00fcrlich kann die erzwungene Anwendung von Schemata \u00fcberall in Ihrer Pipeline verwendet werden, aber denken Sie daran, dass das Streaming von Daten in eine Tabelle in diesem Fall frustrierend sein kann, weil Sie beispielsweise vergessen haben, dass Sie eine weitere Spalte zu den Eingangsdaten hinzugef\u00fcgt haben.<\/p>\n<h2>Verhinderung von Datenverfl\u00fcssigung<\/h2>\n<p>\nZu diesem Zeitpunkt k\u00f6nnten Sie sich fragen, warum dieser ganze Aufruhr? Schlie\u00dflich kann manchmal ein unerwarteter \"Schema-Mismatch\"-Fehler Ihrem Arbeitsprozess einen Strich durch die Rechnung machen, besonders wenn Sie neu bei Delta Lake sind. Warum sollten wir einfach nicht zulassen, dass sich das Schema so \u00e4ndert, wie es notwendig ist, damit ich meinen DataFrame dennoch speichern kann?<\/p>\n<p>Wie das alte Sprichwort sagt: \u201eEine Unze Pr\u00e4vention ist ein Pfund Heilung wert\u201c. Irgendwann, wenn Sie sich nicht um die Anwendung Ihres Schemas k\u00fcmmern, werden die Probleme mit der Kompatibilit\u00e4t der Datentypen h\u00e4ssliche K\u00f6pfe heben \u2013 auf den ersten Blick homogene Rohdatenquellen k\u00f6nnen Sonderf\u00e4lle, besch\u00e4digte Spalten, fehlerhafte Zuordnungen oder andere schreckliche Dinge enthalten, die einem in Alptr\u00e4umen erscheinen. Der beste Ansatz besteht darin, diese Feinde an den Toren abzufangen \u2013 durch die erzwungene Anwendung von Schemata \u2013 und sich mit ihnen im Licht zu befassen, anstatt sp\u00e4ter, wenn sie beginnen, in den dunklen Tiefen Ihres Arbeitscodes herumzust\u00f6bern.<\/p>\n<p>Die zwangsweise Anwendung des Schemas gibt Ihnen die Gewissheit, dass sich das Schema Ihrer Tabelle nicht \u00e4ndert, es sei denn, Sie best\u00e4tigen selbst eine \u00c4nderungsvariante. Dies verhindert die \"Verd\u00fcnnung\" (dilution) von Daten, die entstehen kann, wenn neue Spalten so h\u00e4ufig hinzugef\u00fcgt werden, dass zuvor wertvolle, komprimierte Tabellen aufgrund der Datenflut an Bedeutung und N\u00fctzlichkeit verlieren. Indem Sie dazu ermutigt werden, bewusst zu sein, hohe Standards zu setzen und eine hohe Qualit\u00e4t zu erwarten, sorgt die zwangsweise Anwendung des Schemas genau daf\u00fcr, wozu sie gedacht war \u2013 Ihnen zu helfen, gewissenhaft zu bleiben und Ihre Tabellen sauber zu halten.<\/p>\n<p>Wenn Sie bei weiterer Pr\u00fcfung entscheiden, dass Sie tats\u00e4chlich <i>wissen<\/i> eine neue Spalte hinzuf\u00fcgen m\u00f6chten - kein Problem, hier ist ein einzeiliger Fix. Die L\u00f6sung ist die Evolution des Schemas!<\/p>\n<h2>Was ist die Evolution des Schemas?<\/h2>\n<p>\nDie Evolution des Schemas ist eine Funktion, die es Benutzern erm\u00f6glicht, das aktuelle Tabellenschema leicht entsprechend den sich im Laufe der Zeit \u00e4ndernden Daten zu \u00e4ndern. Sie wird am h\u00e4ufigsten verwendet, um beim Hinzuf\u00fcgen oder \u00dcberschreiben automatisch das Schema anzupassen, um eine oder mehrere neue Spalten einzuf\u00fcgen.<\/p>\n<h2>Wie funktioniert die Evolution des Schemas?<\/h2>\n<p>\nFolgendes Beispiel aus dem vorherigen Abschnitt: Entwickler k\u00f6nnen die Evolution des Schemas einfach nutzen, um neue Spalten hinzuzuf\u00fcgen, die zuvor aufgrund von Schemaabweichungen abgelehnt wurden. Die Evolution des Schemas wird aktiviert, indem man <code>.option('mergeSchema', 'true')<\/code> zu Ihrem Spark-Befehl hinzuf\u00fcgen <code>.write oder .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>\nUm das Schema anzuzeigen, f\u00fchren Sie die folgende Spark SQL-Abfrage aus<\/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=\"Eintauchen in Delta Lake: Schema-Zwang und -Entwicklung\" src=\"\/wp-content\/uploads\/2020\/05\/873ce67da00f69696d5b9328bd90793a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAlternativ k\u00f6nnen Sie diese Option f\u00fcr die gesamte Spark-Sitzung festlegen, indem Sie <code>spark.databricks.delta.schema.autoMerge = True<\/code> in die Spark-Konfiguration aufnehmen. Aber verwenden Sie dies mit Vorsicht, da die zwangsweise Anwendung des Schemas Sie nicht mehr auf unbeabsichtigte Schemaabweichungen hinweist.<\/p>\n<p>Wenn Sie den Parameter <code>mergeSchema<\/code>in die Abfrage einf\u00fcgen, werden alle Spalten, die im DataFrame vorhanden sind, aber nicht in der Zieltabelle, automatisch am Ende des Schemas im Rahmen der Schreibtransaktion hinzugef\u00fcgt. Auch verschachtelte Felder k\u00f6nnen hinzugef\u00fcgt werden, und diese werden ebenfalls am Ende der entsprechenden Spaltenstruktur hinzugef\u00fcgt.<\/p>\n<p>Dateningenieure und Wissenschaftler k\u00f6nnen diese Option nutzen, um neue Spalten (z. B. eine k\u00fcrzlich verfolgte Metrik oder eine Spalte mit Verkaufszahlen f\u00fcr diesen Monat) in ihre bestehenden Produktions-Tabellen f\u00fcr maschinelles Lernen hinzuzuf\u00fcgen, ohne bestehende Modelle zu gef\u00e4hrden, die auf alten Spalten basieren. <\/p>\n<p>Die folgenden Arten von Schema\u00e4nderungen sind im Rahmen der Schema-Evolution beim Hinzuf\u00fcgen oder \u00dcberschreiben von Tabellen zul\u00e4ssig:<\/p>\n<ul>\n<li>Hinzuf\u00fcgen neuer Spalten (dies ist das h\u00e4ufigste Szenario)<\/li>\n<li>\u00c4ndern von Datentypen von NullType -&gt; einem anderen Typ oder Hochstufen von ByteType -&gt; ShortType -&gt; IntegerType<\/li>\n<\/ul>\n<p>\nAndere \u00c4nderungen, die im Rahmen der Schema-Evolution nicht zul\u00e4ssig sind, erfordern, dass Schema und Daten durch das Hinzuf\u00fcgen neu geschrieben werden <code>.option(\"overwriteSchema\", \"true\")<\/code>. Zum Beispiel, wenn die Spalte \u201eFoo\u201c urspr\u00fcnglich ein Integer war und das neue Schema einen Datentyp String h\u00e4tte, m\u00fcssten alle Parquet-Dateien (Daten) neu geschrieben werden. Zu solchen \u00c4nderungen geh\u00f6ren:<\/p>\n<ul>\n<li>L\u00f6schen einer Spalte<\/li>\n<li>\u00c4ndern des Datentyps einer bestehenden Spalte (vor Ort)<\/li>\n<li>Umbenennen von Spalten, die sich nur in der Gro\u00df- und Kleinschreibung unterscheiden (z. B. \u201eFoo\u201c und \u201efoo\u201c)<\/li>\n<\/ul>\n<p>\nSchlie\u00dflich wird mit dem n\u00e4chsten Release von Spark 3.0 das explizite DDL (mit Verwendung von ALTER TABLE) vollst\u00e4ndig unterst\u00fctzt, was es den Nutzern erm\u00f6glicht, die folgenden Aktionen an Tabellen-Schemata durchzuf\u00fchren:<\/p>\n<ul>\n<li>Hinzuf\u00fcgen von Spalten<\/li>\n<li>\u00c4ndern von Kommentaren zu Spalten<\/li>\n<li>Anpassen von Tabelleneigenschaften, die das Verhalten der Tabelle definieren, z. B. Festlegen der Aufbewahrungsdauer des Transaktionsprotokolls.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Was bringt die Schema-Evolution?<\/h2>\n<p>\nSchema-Evolution kann immer dann verwendet werden, wenn Sie <i>beabsichtigen<\/i> das Schema Ihrer Tabelle zu \u00e4ndern (im Gegensatz zu F\u00e4llen, in denen Sie versehentlich Spalten zu Ihrem DataFrame hinzugef\u00fcgt haben, die dort nicht sein sollten). Es ist der einfachste Weg, Ihr Schema zu migrieren, da es automatisch die richtigen Spaltennamen und Datentypen hinzuf\u00fcgt, ohne dass eine explizite Deklaration erforderlich ist.<\/p>\n<h2>Fazit<\/h2>\n<p>\nDie Zwangsanwendung des Schemas lehnt alle neuen Spalten oder andere \u00c4nderungen des Schemas ab, die nicht mit Ihrer Tabelle kompatibel sind. Durch die Festlegung und Einhaltung dieser hohen Standards k\u00f6nnen Analysten und Ingenieure sicher sein, dass ihre Daten ein H\u00f6chstma\u00df an Integrit\u00e4t aufweisen, was es ihnen erm\u00f6glicht, effizientere Gesch\u00e4ftsentscheidungen zu treffen.<\/p>\n<p>Andererseits erg\u00e4nzt die Evolution des Schemas die Zwangsanwendung und vereinfacht <i>vorgesehene<\/i> automatische \u00c4nderungen des Schemas. Letztendlich sollte es keine Komplexit\u00e4t sein \u2014 eine Spalte hinzuzuf\u00fcgen.<\/p>\n<p>Die Zwangsanwendung des Schemas ist das Yang, w\u00e4hrend die Evolution des Schemas das Yin ist. Zusammen erm\u00f6glichen diese Funktionen wie nie zuvor, das Rauschen zu unterdr\u00fccken und das Signal anzupassen.<\/p>\n<p><i>Wir m\u00f6chten auch Mukul Murti und Pranav Anand f\u00fcr ihren Beitrag zu diesem Artikel danken.<\/i><\/p>\n<p>Weitere Artikel aus dieser Reihe:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/21\/diving-into-delta-lake-unpacking-the-transaction-log.html\">Einf\u00fchrung in Delta Lake: Entschl\u00fcsselung des Transaktionsprotokolls<\/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 abspielen\" 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>Fachartikel<\/h2>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/14\/productionizing-machine-learning-with-delta-lake.html\">Maschinelles Lernen auf Unternehmensebene mit Delta Lake<\/a><\/noindex><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/discover\/data-lakes\/introduction\">Was ist ein Data Lake?<\/a><\/noindex><\/p>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/J1P5\/\">Erfahren Sie mehr \u00fcber den Kurs<\/a><\/noindex><\/p>\n<p>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/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\udd47Einf\u00fchrung in Delta Lake: Zwangsanwendung und Evolution des Schemas | ProHoster","description":"Hallo, Habra!","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/82038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=82038"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/82038\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/82039"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=82038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=82038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=82038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}