{"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\/it\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy","title":{"rendered":"Immersione in Delta Lake: applicazione forzata ed evoluzione dello schema","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Ciao, Habr! Vi presento la traduzione dell'articolo <noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/09\/24\/diving-into-delta-lake-schema-enforcement-evolution.html\">\u00abDiving Into Delta Lake: Schema Enforcement &amp; Evolution\u00bb<\/a><\/noindex> degli autori Burak Yavuz, Brenner Heintz e Denny Lee, preparato in vista dell'inizio del corso <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/J1P5\/\">\u00abData Engineer\u00bb<\/a><\/noindex> di OTUS.<\/b><\/i><\/p>\n<p><img decoding=\"async\" alt=\"Immersione in Delta Lake: applicazione forzata ed evoluzione dello schema\" src=\"\/wp-content\/uploads\/2020\/05\/1d20921d8d4a1c1e0f8afee4fc019024.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>I dati, cos\u00ec come la nostra esperienza, si accumulano e si evolvono costantemente. Per non rimanere indietro, i nostri modelli mentali del mondo devono adattarsi ai nuovi dati, alcuni dei quali contengono nuove dimensioni \u2014 nuovi modi di osservare le cose di cui non avevamo mai avuto idea prima. Questi modelli mentali non differiscono molto dagli schemi delle tabelle, che definiscono come classifichiamo e trattiamo le nuove informazioni.<\/p>\n<p>Questo ci porta alla questione della gestione degli schemi. Man mano che le esigenze e i requisiti aziendali cambiano nel tempo, cambia anche la struttura dei tuoi dati. Delta Lake consente di implementare facilmente nuove dimensioni quando i dati cambiano. Gli utenti hanno accesso a una semantica semplice per gestire gli schemi delle proprie tabelle. Questi strumenti includono l'applicazione forzata dello schema (Schema Enforcement), che protegge gli utenti dall'inserimento involontario di errore o dati non necessari nelle proprie tabelle, e l'evoluzione dello schema (Schema Evolution), che consente di aggiungere automaticamente nuove colonne con dati preziosi nei luoghi appropriati. In questo articolo, approfondiremo l'uso di questi strumenti.<\/p>\n<h2>Comprensione degli schemi delle tabelle<\/h2>\n<p>\nOgni DataFrame in Apache Spark contiene uno schema che definisce la forma dei dati, come tipi di dati, colonne e metadati. Con Delta Lake, lo schema della tabella \u00e8 salvato in formato JSON all'interno del log delle transazioni.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Cos'\u00e8 l'applicazione forzata dello schema?<\/h2>\n<p>\nL'applicazione forzata dello schema (Schema Enforcement), nota anche come validazione dello schema (Schema Validation), \u00e8 un meccanismo di protezione in Delta Lake che garantisce la qualit\u00e0 dei dati, rifiutando le registrazioni che non corrispondono allo schema della tabella. Proprio come un hostess alla reception di un ristorante popolare che accetta solo con prenotazione, verifica che ogni colonna di dati inserita nella tabella sia presente nell'elenco delle colonne previste (in altre parole, che ci sia una \u201cprenotazione\u201d per ciascuna di esse) e rifiuta qualsiasi registrazione con colonne non presenti nell'elenco.<\/p>\n<h2>Come funziona l'applicazione forzata dello schema?<\/h2>\n<p>\nDelta Lake utilizza il controllo dello schema durante la scrittura, il che significa che tutte le nuove registrazioni nella tabella vengono verificate per compatibilit\u00e0 con lo schema della tabella di destinazione al momento della scrittura. Se lo schema non \u00e8 compatibile, Delta Lake annulla completamente la transazione (i dati non vengono scritti) e genera un'eccezione per informare l'utente dell'incongruenza.<br \/>\nPer determinare la compatibilit\u00e0 di una registrazione con la tabella, Delta Lake utilizza le seguenti regole. DataFrame da registrare:<\/p>\n<ul>\n<li>non pu\u00f2 contenere colonne aggiuntive non presenti nello schema della tabella di destinazione. Al contrario, va bene se i dati in ingresso non contengono tutte le colonne della tabella: a queste colonne verranno semplicemente assegnati valori nulli.<\/li>\n<li>non pu\u00f2 avere tipi di dati delle colonne diversi dai tipi di dati delle colonne nella tabella di destinazione. Se una colonna della tabella di destinazione contiene dati di tipo StringType, ma la colonna corrispondente nel DataFrame contiene dati di tipo IntegerType, l'applicazione forzata dello schema generer\u00e0 un'eccezione e impedir\u00e0 l'esecuzione dell'operazione di scrittura.<\/li>\n<li>non pu\u00f2 contenere nomi di colonne che differiscono solo per maiuscole e minuscole. Ci\u00f2 significa che non puoi avere colonne con i nomi 'Foo' e 'foo' definite nella stessa tabella. Sebbene Spark possa essere utilizzato in modalit\u00e0 sensibile o insensibile (predefinita) alle maiuscole, Delta Lake conserva le maiuscole, ma \u00e8 insensibile nell'ambito della memorizzazione dello schema. Parquet \u00e8 sensibile alle maiuscole quando memorizza e restituisce informazioni sulla colonna. Per evitare possibili errori, danneggiamenti dei dati o perdita di dati (come abbiamo personalmente affrontato in Databricks), abbiamo deciso di aggiungere questa limitazione.<\/li>\n<\/ul>\n<p>\nPer illustrare ci\u00f2, diamo un'occhiata a cosa accade nel codice sottostante quando si tenta di aggiungere alcune colonne appena generate a una tabella Delta Lake che non \u00e8 ancora configurata per accettarle.<\/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>\nInvece di aggiungere automaticamente nuove colonne, Delta Lake applica lo schema e interrompe la scrittura. Per aiutare a identificare quale colonna (o pi\u00f9 colonne) sta causando l'incongruenza, Spark stampa entrambi gli schemi dallo stack trace per il confronto.<\/p>\n<h2>Qual \u00e8 il vantaggio dell'applicazione forzata dello schema?<\/h2>\n<p>\nPoich\u00e9 l'applicazione forzata dello schema rappresenta un controllo piuttosto rigoroso, \u00e8 uno strumento eccellente da utilizzare come portinaio per un set di dati puliti e completamente trasformati, pronto per la produzione o il consumo. In genere, viene applicato a tabelle che forniscono direttamente i dati:<\/p>\n<ul>\n<li>Algoritmi di apprendimento automatico<\/li>\n<li>Dashboard BI<\/li>\n<li>Analisi dei dati e strumenti di visualizzazione<\/li>\n<li>Qualsiasi sistema di produzione che richieda schemi semantici rigorosamente strutturati e tipizzati.<\/li>\n<\/ul>\n<p>\nPer preparare i propri dati a questa barriera finale, molti utenti utilizzano una semplice architettura \u201cmulti-hop\u201d, che introduce gradualmente struttura nelle loro tabelle. Per saperne di pi\u00f9, puoi consultare l'articolo <noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/14\/productionizing-machine-learning-with-delta-lake.html\">Machine Learning di livello produttivo con Delta Lake.<\/a><\/noindex><\/p>\n<p>Certo, l'applicazione forzata dello schema pu\u00f2 essere utilizzata in qualsiasi parte del tuo pipeline, ma ricorda che la registrazione in streaming in tabella pu\u00f2 essere frustrante se, ad esempio, hai dimenticato di aver aggiunto un'altra colonna ai dati in ingresso.<\/p>\n<h2>Prevenzione della diluizione dei dati<\/h2>\n<p>\nA questo punto potresti chiederti, perch\u00e9 tanto clamore? Dopotutto, a volte un errore inaspettato di \"incompatibilit\u00e0 dello schema\" pu\u00f2 intralciare il tuo flusso di lavoro, specialmente se sei un principiante in Delta Lake. Perch\u00e9 non permettere semplicemente allo schema di cambiare in modo che io possa registrare il mio DataFrame, a prescindere da tutto?<\/p>\n<p>Come dice un vecchio detto, \u201cun\u2019oncia di prevenzione vale una libbra di cura\u201d. A un certo punto, se non ti prendi cura dell'applicazione del tuo schema, sorgono problemi di compatibilit\u00e0 dei tipi di dati \u2014 a prima vista, fonti di dati grezzi omogenee possono contenere casi limite, colonne danneggiate, mappature mal formate o altre cose spaventose che ti assillano nei sogni. Il miglior approccio \u00e8 fermare questi nemici alle porte \u2014 tramite l'applicazione forzata dello schema \u2014 e affrontarli alla luce del sole, piuttosto che pi\u00f9 tardi, quando iniziano a gironzolare nelle oscure profondit\u00e0 del tuo codice di lavoro.<\/p>\n<p>L'applicazione forzata dello schema assicura che la struttura della tua tabella non cambi, a meno che tu non approvi un'eventuale modifica. Questo previene la \"diluzione\" dei dati, che pu\u00f2 avvenire quando nuove colonne vengono aggiunte cos\u00ec frequentemente che le tabelle compresse e preziose perdono il loro valore e utilit\u00e0 a causa dell'inondazione dei dati. Incoraggiandoti a essere deliberato, impostare standard elevati e aspettarti alta qualit\u00e0, l'applicazione forzata dello schema fa esattamente ci\u00f2 per cui \u00e8 stata concepita: aiutarti a mantenere l'integrit\u00e0 e le tue tabelle a essere pulite.<\/p>\n<p>Se, dopo un ulteriore esame, decidi che hai realmente <i>bisogno<\/i> di aggiungere una nuova colonna, nessun problema, di seguito \u00e8 riportata una soluzione in una riga. La soluzione \u00e8 l'evoluzione dello schema!<\/p>\n<h2>Cos'\u00e8 l'evoluzione dello schema?<\/h2>\n<p>\nL'evoluzione dello schema \u00e8 una funzionalit\u00e0 che consente agli utenti di modificare facilmente l'attuale schema della tabella in base ai dati che cambiano nel tempo. Viene utilizzata principalmente durante l'operazione di aggiunta o sovrascrittura per adattare automaticamente lo schema includendo una o pi\u00f9 nuove colonne.<\/p>\n<h2>Come funziona l'evoluzione dello schema?<\/h2>\n<p>\nSeguendo l'esempio del paragrafo precedente, gli sviluppatori possono facilmente utilizzare l'evoluzione dello schema per aggiungere nuove colonne che erano precedentemente rifiutate a causa di incompatibilit\u00e0 con lo schema. L'evoluzione dello schema viene attivata aggiungendo <code>.option('mergeSchema', 'true')<\/code> al tuo comando Spark <code>.write o .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>\nPer visualizzare il grafico, esegui la seguente query Spark SQL<\/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=\"Immersione in Delta Lake: applicazione forzata ed evoluzione dello schema\" src=\"\/wp-content\/uploads\/2020\/05\/873ce67da00f69696d5b9328bd90793a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIn alternativa, puoi impostare questa opzione per tutta la sessione Spark, aggiungendo <code>spark.databricks.delta.schema.autoMerge = True<\/code> nella configurazione di Spark. Ma usala con cautela, poich\u00e9 l'applicazione forzata dello schema non ti avviser\u00e0 pi\u00f9 di eventuali incompatibilit\u00e0 non intenzionali.<\/p>\n<p>Attivando il parametro <code>mergeSchema<\/code>, tutte le colonne presenti nel DataFrame ma assenti nella tabella di destinazione vengono automaticamente aggiunte alla fine dello schema all'interno della transazione di scrittura. Possono essere aggiunti anche campi nidificati, e questi saranno anch'essi aggiunti alla fine delle colonne corrispondenti della struttura.<\/p>\n<p>Data ingegneri e scienziati possono utilizzare questa opzione per aggiungere nuove colonne (una metrica recentemente monitorata o una colonna delle vendite di questo mese) alle loro esistenti tabelle di produzione di apprendimento automatico, senza compromettere i modelli esistenti basati sulle vecchie colonne. <\/p>\n<p>I seguenti tipi di modifiche allo schema sono consentiti nell'ambito dell'evoluzione dello schema durante l'aggiunta o la riscrittura di una tabella:<\/p>\n<ul>\n<li>Aggiunta di nuove colonne (questo \u00e8 lo scenario pi\u00f9 comune)<\/li>\n<li>Modifica dei tipi di dati da NullType -&gt; qualsiasi altro tipo o upgrade da ByteType -&gt; ShortType -&gt; IntegerType<\/li>\n<\/ul>\n<p>\nAltre modifiche, non consentite nell'ambito dell'evoluzione dello schema, richiedono che schema e dati siano riscritti attraverso l'aggiunta <code>.option(\"overwriteSchema\", \"true\")<\/code>. Ad esempio, nel caso in cui la colonna \"Foo\" fosse inizialmente un intero e il nuovo schema fosse di tipo stringa, allora tutti i file Parquet (dati) dovrebbero essere riscritti. Queste modifiche includono:<\/p>\n<ul>\n<li>rimozione di una colonna<\/li>\n<li>modifica del tipo di dati di una colonna esistente (in loco)<\/li>\n<li>rinominare colonne che differiscono solo per maiuscole e minuscole (ad esempio \"Foo\" e \"foo\")<\/li>\n<\/ul>\n<p>\nInfine, con la prossima release di Spark 3.0, sar\u00e0 supportato completamente DDL esplicito (utilizzando ALTER TABLE), consentendo agli utenti di eseguire le seguenti operazioni sugli schemi delle tabelle:<\/p>\n<ul>\n<li>aggiunta di colonne<\/li>\n<li>modifica dei commenti sulle colonne<\/li>\n<li>configurazione delle propriet\u00e0 della tabella che definiscono il comportamento della tabella, ad esempio impostare la durata della conservazione del registro delle transazioni.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Qual \u00e8 il vantaggio dell'evoluzione dello schema?<\/h2>\n<p>\nL'evoluzione dello schema pu\u00f2 essere utilizzata ogni volta che si <i>intende<\/i> modificare lo schema della propria tabella (in contrapposizione ai casi in cui si \u00e8 accidentalmente aggiunto al proprio DataFrame colonne che non dovrebbero esserci). Questo \u00e8 il modo pi\u00f9 semplice per migrare il proprio schema, poich\u00e9 aggiunge automaticamente i nomi delle colonne e i tipi di dati corretti senza la necessit\u00e0 di dichiararli esplicitamente.<\/p>\n<h2>Conclusione<\/h2>\n<p>\nL'applicazione forzata dello schema rifiuta qualsiasi nuova colonna o altra modifica dello schema che non sia compatibile con la tua tabella. Stabilendo e mantenendo questi elevati standard, gli analisti e gli ingegneri possono contare sul fatto che i loro dati hanno il massimo livello di integrit\u00e0, ragionando su di esso in modo chiaro e chiaro, il che consente loro di prendere decisioni aziendali pi\u00f9 efficaci.<\/p>\n<p>D'altra parte, l'evoluzione dello schema si aggiunge all'applicazione forzata, semplificando <i>le modifiche automatiche dello schema.<\/i> Alla fine, non dovrebbe essere una complessit\u00e0 - aggiungere una colonna.<\/p>\n<p>L'applicazione forzata dello schema \u00e8 lo yang, mentre l'evoluzione dello schema \u00e8 lo yin. Quando utilizzate insieme, queste funzioni semplificano pi\u00f9 che mai la soppressione del rumore e la regolazione del segnale.<\/p>\n<p><i>Vorremmo anche ringraziare Mukul Murty e Pranav Anand per il loro contributo a questo articolo.<\/i><\/p>\n<p>Altri articoli di questa 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\">Immersione nel Delta Lake: decodificare il log delle transazioni<\/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=\"Guarda il video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h2>Articoli correlati<\/h2>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/14\/productionizing-machine-learning-with-delta-lake.html\">Machine Learning di livello produttivo con Delta Lake<\/a><\/noindex><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/discover\/data-lakes\/introduction\">Cos'\u00e8 un data lake?<\/a><\/noindex><\/p>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/J1P5\/\">Scopri di pi\u00f9 sul corso<\/a><\/noindex><\/p>\n<p>Fonte: <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\/it\/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=\"it_IT\" \/>\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\/it\/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\udd47Immersione nel Delta Lake: applicazione forzata e evoluzione dello schema | ProHoster","description":"Ciao, Habr!","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/82038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=82038"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/82038\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/82039"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=82038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=82038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=82038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}