{"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":"Einf\u00fchrung in Delta Lake: Schema-\u00dcberpr\u00fcfung und Evolution","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Hallo, Habr! Ich pr\u00e4sentiere Ihnen die \u00dcbersetzung des Artikels <noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/09\/24\/diving-into-delta-lake-schema-enforcement-evolution.html\">\u00abEinf\u00fchrung in Delta Lake: Schema-\u00dcberpr\u00fcfung &amp; Evolution\u00bb<\/a><\/noindex> von Burak Yavuz, Brenner Heintz und Denny Lee, vorbereitet im Vorfeld des Kursstarts <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/J1P5\/\">\u201eData Engineer\u201c<\/a><\/noindex> von OTUS.<\/b><\/i><\/p>\n<p><img decoding=\"async\" alt=\"Einf\u00fchrung in Delta Lake: Schema-\u00dcberpr\u00fcfung und Evolution\" src=\"\/wp-content\/uploads\/2020\/05\/1d20921d8d4a1c1e0f8afee4fc019024.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Daten, ebenso wie unsere Erfahrungen, sammeln sich kontinuierlich an und entwickeln sich weiter. Um nicht hinterherzuhinken, m\u00fcssen sich unsere mentalen Modelle der Welt an neue Daten anpassen, von denen einige neue Dimensionen beinhalten \u2014 neue Ans\u00e4tze, um Dinge zu beobachten, von denen wir vorher nichts wussten. Diese mentalen Modelle sind wenig anders als die Schemas von Tabellen, die festlegen, wie wir neue Informationen klassifizieren und verarbeiten.<\/p>\n<p>Das f\u00fchrt uns zur Frage des Managements von Schemata. W\u00e4hrend sich die gesch\u00e4ftlichen Anforderungen und Aufgaben im Laufe der Zeit \u00e4ndern, ver\u00e4ndert sich auch die Struktur Ihrer Daten. Delta Lake erm\u00f6glicht es, neue Dimensionen beim \u00c4ndern von Daten einfach zu implementieren. Benutzer haben Zugriff auf eine einfache Semantik zur Verwaltung der Schemata ihrer Tabellen. Zu diesen Werkzeugen geh\u00f6ren die Schema Enforcement-Funktion, die Benutzer vor unbeabsichtigter Verschmutzung ihrer Tabellen durch Fehler oder unerw\u00fcnschte Daten sch\u00fctzt, sowie die Schema Evolution, die es erm\u00f6glicht, neue Spalten mit wertvollen Daten automatisch an den entsprechenden Stellen hinzuzuf\u00fcgen. In diesem Artikel werden wir uns eingehender mit der Nutzung 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, einschlie\u00dflich Datentypen, Spalten und Metadaten. Mit Delta Lake wird das Tabellenschema im JSON-Format im Transaktionsprotokoll gespeichert.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Was ist Schema Enforcement?<\/h2>\n<p>\nDie erzwungene Anwendung des Schemas (Schema Enforcement), auch bekannt als Schema-\u00dcberpr\u00fcfung (Schema Validation), ist ein Schutzmechanismus in Delta Lake, der die Datenqualit\u00e4t gew\u00e4hrleistet, indem er Datens\u00e4tze, die nicht mit dem Tabellenschema \u00fcbereinstimmen, ablehnt. \u00c4hnlich wie eine Empfangsdame in einem beliebten Restaurant, die nur Reservierungen annimmt, \u00fcberpr\u00fcft es, ob jede Datenspalte, die in die Tabelle eingegeben wird, in der entsprechenden Liste der erwarteten Spalten vorhanden ist (mit anderen Worten, ob f\u00fcr jede von ihnen eine \"Reservierung\" besteht) und lehnt alle Datens\u00e4tze mit Spalten ab, die nicht in dieser Liste stehen.<\/p>\n<h2>Wie funktioniert die erzwungene Anwendung des Schemas?<\/h2>\n<p>\nDelta Lake verwendet die Schema-\u00dcberpr\u00fcfung beim Schreiben, was bedeutet, dass alle neuen Datens\u00e4tze in die Tabelle zur Kompatibilit\u00e4t mit dem Schema der Ziel-Tabelle w\u00e4hrend des Schreibvorgangs \u00fcberpr\u00fcft werden. Wenn das Schema inkompatibel ist, hebt Delta Lake die Transaktion vollst\u00e4ndig auf (die Daten werden nicht geschrieben) und generiert eine Ausnahme, um den Benutzer \u00fcber die Diskrepanz zu informieren.<br \/>\nUm die Kompatibilit\u00e4t eines Datensatzes mit der Tabelle zu bestimmen, verwendet Delta Lake die folgenden Regeln. Der zu schreibende DataFrame:<\/p>\n<ul>\n<li>kann keine zus\u00e4tzlichen Spalten enthalten, die nicht im Schema der Zieltabelle 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>kann keine Datentypen f\u00fcr Spalten haben, die sich von den Datentypen der Spalten in der Zieltabelle unterscheiden. Wenn eine Spalte der Zieltabelle Daten des Typs StringType enth\u00e4lt, die entsprechende Spalte im DataFrame jedoch Daten des Typs IntegerType hat, wird beim erzwungenen Schemaanwendung eine Ausnahme ausgel\u00f6st und die Schreiboperation verhindert.<\/li>\n<li>\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u043c. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u043c\u0435\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0441 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 &#8216;Foo&#8217; \u0438 &#8216;foo&#8217;, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435. \u0425\u043e\u0442\u044f Spark \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0438\u043b\u0438 \u043d\u0435\u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e) \u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443 \u0440\u0435\u0436\u0438\u043c\u0435, Delta Lake \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u043d\u043e \u043d\u0435\u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u0435\u043d \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0441\u0445\u0435\u043c\u044b. Parquet \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u0435\u043d \u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443 \u043f\u0440\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430. \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a, \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0438\u0445 \u043f\u043e\u0442\u0435\u0440\u0438 (\u0441 \u0447\u0435\u043c \u043c\u044b \u043b\u0438\u0447\u043d\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0432 Databricks), \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435.<\/li>\n<\/ul>\n<p>\nUm dies zu veranschaulichen, werfen wir einen Blick auf den folgenden Code, der versucht, einige neu generierte Spalten in eine 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>\nAnstatt neue Spalten automatisch hinzuzuf\u00fcgen, erzwingt Delta Lake das Schema und stoppt die Aufzeichnung. Um festzustellen, welche Spalte (oder mehrere) die Ursache f\u00fcr die Diskrepanz ist, gibt Spark beide Schemata im Stack-Trace zur Vergleich an.<\/p>\n<h2>Was sind die Vorteile des erzwungenen Schemas?<\/h2>\n<p>\nDa das Erzwingen eines Schemas eine recht strenge Pr\u00fcfung darstellt, ist es ein hervorragendes Werkzeug, um den Zugang zu einem sauberen, vollst\u00e4ndig transformierten Datensatz zu erm\u00f6glichen, der bereit f\u00fcr die Produktion oder den Verbrauch ist. Es wird in der Regel auf Tabellen angewendet, die direkt Daten liefern:<\/p>\n<ul>\n<li>Maschinenlernalgorithmen<\/li>\n<li>BI-Dashboards<\/li>\n<li>Datenanalysen und Visualisierungstools<\/li>\n<li>Jeder Produktionssystem, das streng strukturierte, stark typisierte semantische Schemata erfordert.<\/li>\n<\/ul>\n<p>\nUm Ihre Daten auf diese letzte H\u00fcrde vorzubereiten, verwenden viele Benutzer eine einfache \"Multi-Hop\"-Architektur, die nach und nach Struktur in ihre Tabellen bringt. Um mehr dar\u00fcber zu erfahren, k\u00f6nnen Sie den Artikel lesen. <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 des Schemas \u00fcberall in Ihrem Pipeline verwendet werden, aber denken Sie daran, dass das Streamen in eine Tabelle in diesem Fall frustrierend sein kann, insbesondere wenn Sie vergessen haben, eine zus\u00e4tzliche Spalte zu den Eingabedaten hinzuzuf\u00fcgen.<\/p>\n<h2>Vermeidung von Datenverd\u00fcnnung.<\/h2>\n<p>\nAn diesem Punkt k\u00f6nnten Sie sich fragen, warum so viel Aufregung? Schlie\u00dflich kann ein unerwarteter Fehler \"Schema-Mismatch\" Ihnen in Ihrem Workflow Probleme bereiten, insbesondere wenn Sie neu bei Delta Lake sind. Warum also nicht einfach das Schema so \u00e4ndern, wie es ben\u00f6tigt wird, damit ich meinen DataFrame ohne weiteres speichern kann?<\/p>\n<p>Wie das 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 sich die Probleme mit der Datenkompatibilit\u00e4t bemerkbar machen \u2013 vermeintlich homogene Quellen unstrukturierter Daten k\u00f6nnen Grenzf\u00e4lle, besch\u00e4digte Spalten, fehlerhaft formatierte Darstellungen oder andere schreckliche Dinge enthalten, die einem in den Albtr\u00e4umen erscheinen. Der beste Ansatz ist, diese Feinde an der Pforte abzuwehren \u2013 durch die konsequente Durchsetzung des Schemas \u2013 und sich mit ihnen im Hellen auseinanderzusetzen, anstatt sp\u00e4ter, wenn sie beginnen, in den dunklen Tiefen Ihres Arbeitscodes herumzustochern.<\/p>\n<p>Die erzwungene Anwendung des Schemas sorgt daf\u00fcr, dass sich das Schema Ihrer Tabelle nicht \u00e4ndert, es sei denn, Sie best\u00e4tigen selbst eine \u00c4nderungsoption. Dies verhindert die \"Verd\u00fcnnung\" (dilution) von Daten, die auftreten kann, wenn neue Spalten so h\u00e4ufig hinzugef\u00fcgt werden, dass zuvor wertvolle, komprimierte Tabellen an Bedeutung und N\u00fctzlichkeit durch die Datenflut verlieren. Indem Sie dazu ermutigt werden, absichtlich zu handeln, hohe Standards zu setzen und hohe Qualit\u00e4t zu erwarten, erf\u00fcllt die erzwungene Anwendung des Schemas genau ihren Zweck \u2013 sie hilft Ihnen, gewissenhaft zu bleiben und Ihre Tabellen sauber zu halten.<\/p>\n<p>Sollten Sie bei weiterer \u00dcberlegung feststellen, dass Sie tats\u00e4chlich <i>man muss<\/i> eine neue Spalte hinzuf\u00fcgen m\u00f6chten, ist das kein Problem, hier ist eine einzeilige L\u00f6sung. Die L\u00f6sung ist die Evolution des Schemas!<\/p>\n<h2>Was ist die Evolution des Schemas?<\/h2>\n<p>\nDie Schema-Evolution ist eine Funktion, die es Benutzern erm\u00f6glicht, das aktuelle Tabellenschema entsprechend den sich im Laufe der Zeit \u00e4ndernden Daten einfach zu \u00e4ndern. Sie wird am h\u00e4ufigsten bei Additions- oder \u00dcberschreibvorg\u00e4ngen verwendet, um das Schema automatisch anzupassen, sodass ein oder mehrere neue Spalten eingebunden werden.<\/p>\n<h2>Wie funktioniert die Schema-Evolution?<\/h2>\n<p>\nEntwickler k\u00f6nnen der Schema-Evolution m\u00fchelos folgen, indem sie neue Spalten hinzuf\u00fcgen, die zuvor aufgrund von Schema-Inkompatibilit\u00e4ten abgelehnt wurden. Die Schema-Evolution wird aktiviert, indem man <code>.option('mergeSchema', 'true')<\/code> zu Ihrem Spark-Befehl <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 Diagramm 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=\"Einf\u00fchrung in Delta Lake: Schema-\u00dcberpr\u00fcfung und Evolution\" 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 einf\u00fcgen. Seien Sie jedoch vorsichtig, da eine erzwungene Schemaanwendung Sie nicht mehr \u00fcber unbeabsichtigte Schemainkonsistenzen informiert.<\/p>\n<p>Indem Sie den Parameter <code>mergeSchema<\/code>, alle Spalten, die im DataFrame vorhanden sind, aber nicht in der Zieltabelle, werden automatisch am Ende des Schemas im Rahmen der Schreibtransaktion hinzugef\u00fcgt. Auch verschachtelte Felder k\u00f6nnen hinzugef\u00fcgt werden und werden ebenfalls am Ende der entsprechenden Spaltenstruktur hinzugef\u00fcgt.<\/p>\n<p>Dateningenieure und Wissenschaftler k\u00f6nnen diese Option nutzen, um neue Spalten (m\u00f6glicherweise eine neu verfolgte Kennzahl oder einen Spaltennamen f\u00fcr die Verkaufszahlen diesen Monat) in ihre bestehenden Produktionsdatenbanken f\u00fcr maschinelles Lernen hinzuzuf\u00fcgen, ohne die bestehenden Modelle, die auf alten Spalten basieren, zu beeintr\u00e4chtigen. <\/p>\n<p>Die folgenden Arten von Schema\u00e4nderungen sind im Rahmen der evolution\u00e4ren Schema\u00e4nderungen 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>\u00c4nderung von Datentypen von NullType -&gt; jeden anderen Typ oder Hochstufung von ByteType -&gt; ShortType -&gt; IntegerType<\/li>\n<\/ul>\n<p>\nAndere \u00c4nderungen, die im Rahmen der evolution\u00e4ren Schema\u00e4nderungen nicht zul\u00e4ssig sind, erfordern, dass das Schema und die Daten durch Hinzuf\u00fcgen \u00fcberschrieben werden <code>.option(&quot;overwriteSchema&quot;, &quot;true&quot;)<\/code>. Zum Beispiel, wenn die Spalte \u201eFoo\u201c urspr\u00fcnglich vom Typ 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>das Entfernen einer Spalte<\/li>\n<li>die \u00c4nderung des Datentyps einer vorhandenen Spalte (in-place)<\/li>\n<li>das Umbenennen von Spalten, die sich nur im Gro\u00df- und Kleinschreibungs unterscheiden (z. B. \u201eFoo\u201c und \u201efoo\u201c)<\/li>\n<\/ul>\n<p>\nSchlie\u00dflich wird mit der n\u00e4chsten Version von Spark 3.0 die explizite DDL (mittels ALTER TABLE) vollst\u00e4ndig unterst\u00fctzt, was es den Benutzern erm\u00f6glicht, folgende Aktionen an Tabellenschemata auszuf\u00fchren:<\/p>\n<ul>\n<li>das Hinzuf\u00fcgen von Spalten<\/li>\n<li>das \u00c4ndern von Kommentaren zu Spalten<\/li>\n<li>das Anpassen von Tabelleneigenschaften, die das Verhalten der Tabelle bestimmen, wie z. B. das Festlegen der Dauer der Transaktionsprotokollaufbewahrung.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Was sind die Vorteile der Schema-Evolution?<\/h2>\n<p>\nSchema-Evolution kann immer dann genutzt werden, wenn Sie <i>beabsichtigen<\/i> \u00c4ndern Sie das Schema Ihrer Tabelle (im Gegensatz zu den F\u00e4llen, in denen Sie versehentlich Spalten in Ihrem DataFrame hinzugef\u00fcgt haben, die dort nicht sein sollten). Dies ist der einfachste Weg, Ihr Schema zu migrieren, da es automatisch die richtigen Spaltennamen und Datentypen hinzuf\u00fcgt, ohne dass diese explizit deklariert werden m\u00fcssen.<\/p>\n<h2>Fazit<\/h2>\n<p>\nDie erzwungene Anwendung des Schemas weist alle neuen Spalten oder andere Schema\u00e4nderungen zur\u00fcck, die nicht mit Ihrer Tabelle kompatibel sind. Indem hohe Standards gesetzt und aufrechterhalten werden, k\u00f6nnen Analysten und Ingenieure sicherstellen, dass ihre Daten die h\u00f6chste Integrit\u00e4t aufweisen, was es ihnen erm\u00f6glicht, klar und pr\u00e4zise zu argumentieren, um effektivere Gesch\u00e4ftsentscheidungen zu treffen.<\/p>\n<p>Andererseits erg\u00e4nzt die Schemaentwicklung die erzwungene Anwendung und vereinfacht <i>vorgesehene<\/i> automatische Schema\u00e4nderungen. Schlie\u00dflich sollte es unkompliziert sein, eine Spalte hinzuzuf\u00fcgen.<\/p>\n<p>Die erzwungene Anwendung des Schemas ist das Yang, w\u00e4hrend die Schemaentwicklung das Yin ist. In Kombination erleichtern diese Funktionen mehr denn je die Unterdr\u00fcckung von Rauschen und die Anpassung des Signals.<\/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 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\">Einf\u00fchrung in Delta Lake: Entpackung 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>Artikel zu diesem Thema<\/h2>\n<p>\n<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><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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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,\" \/>\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) 4.9.10\" \/>\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! \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,\" \/>\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, Habr! Ich pr\u00e4sentiere Ihnen die \u00dcbersetzung des Artikels \"Diving Into Delta Lake: Schema Enforcement &amp; Evolution\" von Burak Yavuz, Brenner Heintz und Denny Lee, der im Vorfeld des Kurses \"Data Engineer\" von OTUS erstellt wurde. Daten, wie auch unsere Erfahrungen, lagern sich st\u00e4ndig an und entwickeln sich weiter. Um nicht zur\u00fcckzubleiben, m\u00fcssen unsere mentalen Modelle der Welt an die neuen Daten angepasst werden.","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! \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,","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"},"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}]}}