{"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 e evoluzione dello schema","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Ciao, Habr! Ti presento la traduzione di un articolo <noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/09\/24\/diving-into-delta-lake-schema-enforcement-evolution.html\">\u00abEsplorando Delta Lake: Enforcement e Evoluzione dello Schema\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 e evoluzione dello schema\" src=\"\/wp-content\/uploads\/2020\/05\/1d20921d8d4a1c1e0f8afee4fc019024.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>I dati, come la nostra esperienza, continuano a crescere e a evolversi. Per non rimanere indietro, i nostri modelli mentali del mondo devono adattarsi ai nuovi dati, alcuni dei quali portano nuove dimensioni \u2014 nuovi modi di osservare cose di cui prima non avevamo idea. Questi modelli mentali sono poco diversi dagli schemi delle tabelle che definiscono come classifichiamo e gestiamo nuove informazioni.<\/p>\n<p>Questo ci porta alla questione della gestione degli schemi. Con il cambiamento delle esigenze e delle richieste aziendali nel tempo, anche la struttura dei tuoi dati cambia. Delta Lake consente di implementare facilmente nuove dimensioni mentre i dati cambiano. Gli utenti hanno accesso a una semantica semplice per gestire gli schemi delle loro tabelle. Questi strumenti includono l'applicazione forzata dello schema (Schema Enforcement), che protegge gli utenti dall'inquinamento involontario delle loro tabelle per errori o dati indesiderati, e l'evoluzione dello schema (Schema Evolution), che consente di aggiungere automaticamente nuove colonne con dati preziosi nei posti giusti. In questo articolo, approfondiremo l'uso di questi strumenti.<\/p>\n<h2>Comprendere gli schemi delle tabelle<\/h2>\n<p>\nOgni DataFrame in Apache Spark contiene uno schema che definisce la forma dei dati, come i tipi di dati, le colonne e i metadati. Con Delta Lake, lo schema della tabella \u00e8 conservato in formato JSON all'interno del log delle transazioni.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Che 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'inserviente alla reception di un ristorante popolare che accetta solo su prenotazione, verifica se ogni colonna di dati inseriti nella tabella \u00e8 presente nell'elenco atteso delle colonne (in altre parole, se ogni colonna ha una 'prenotazione'), e rifiuta qualsiasi registrazione con colonne che non figurano nell'elenco.<\/p>\n<h2>Come funziona l'applicazione forzata dello schema?<\/h2>\n<p>\nDelta Lake utilizza la validazione dello schema durante la scrittura, il che significa che tutte le nuove registrazioni nella tabella vengono verificate per la compatibilit\u00e0 con lo schema della tabella di destinazione durante la scrittura. Se lo schema non \u00e8 compatibile, Delta Lake annulla completamente la transazione (i dati non vengono scritti) e genera un'eccezione per avvisare l'utente della non conformit\u00e0.<br \/>\nPer determinare la compatibilit\u00e0 di una registrazione con la tabella, Delta Lake utilizza le seguenti regole. Il DataFrame da scrivere:<\/p>\n<ul>\n<li>non pu\u00f2 contenere colonne aggiuntive che non siano nello schema della tabella di destinazione. D'altra parte, va bene se i dati in ingresso non contengono tutte le colonne della tabella \u2014 a queste colonne verranno semplicemente assegnati valori null.<\/li>\n<li>non pu\u00f2 avere tipi di dato delle colonne che differiscono dai tipi di dato delle colonne nella tabella di destinazione. Se la colonna nella tabella di destinazione contiene dati di tipo StringType, ma la colonna corrispondente nel DataFrame contiene dati di tipo IntegerType, l'applicazione forzata dello schema sollever\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 il maiuscolo e il minuscolo. Ci\u00f2 significa che non puoi avere colonne con nomi 'Foo' e 'foo' definite nella stessa tabella. Anche se Spark pu\u00f2 essere utilizzato in modalit\u00e0 sensibile o insensibile (di default) al maiuscolo, Delta Lake mantiene il maiuscolo, ma \u00e8 insensibile all'interno della memorizzazione dello schema. Parquet \u00e8 sensibile al maiuscolo durante la memorizzazione e il recupero delle informazioni della colonna. Per evitare possibili errori, danni ai dati o perdite (con cui abbiamo personalmente avuto a che fare in Databricks), abbiamo deciso di aggiungere questa restrizione.<\/li>\n<\/ul>\n<p>\nPer illustrare questo, diamo un'occhiata a cosa succede nel codice seguente quando si cerca di aggiungere alcune colonne recentemente 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 le nuove colonne, Delta Lake impone lo schema e ferma la scrittura. Per aiutare a determinare quale colonna (o colonne) sta causando la non conformit\u00e0, Spark stampa entrambi gli schemi dallo stack trace per il confronto.<\/p>\n<h2>Quali sono i vantaggi dell'applicazione forzata dello schema?<\/h2>\n<p>\nPoich\u00e9 l'applicazione forzata dello schema \u00e8 una verifica piuttosto rigorosa, \u00e8 uno strumento eccellente da utilizzare come guardiano di un insieme di dati pulito e completamente trasformato, pronto per la produzione o il consumo. Di solito \u00e8 applicato a tabelle che forniscono direttamente i dati:<\/p>\n<ul>\n<li>Algoritmi di apprendimento automatico<\/li>\n<li>Cruscotti BI<\/li>\n<li>Analisi dei dati e strumenti di visualizzazione<\/li>\n<li>Qualsiasi sistema produttivo 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 un'architettura semplice \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\">Apprendimento automatico di livello industriale con Delta Lake.<\/a><\/noindex><\/p>\n<p>Naturalmente, l'applicazione forzata dello schema pu\u00f2 essere utilizzata ovunque nel tuo pipeline, ma ricorda che la registrazione streaming in una tabella, in tal caso, pu\u00f2 essere frustrante, poich\u00e9, ad esempio, potresti dimenticare di aver aggiunto un ulteriore campo ai dati in ingresso.<\/p>\n<h2>Prevenzione della diluizione dei dati<\/h2>\n<p>\nA questo punto potresti chiederti perch\u00e9 tale eccitazione? Dopotutto, a volte un errore inaspettato 'incoerenza dello schema' pu\u00f2 ostacolare il tuo flusso di lavoro, specialmente se sei un novizio in Delta Lake. Perch\u00e9 non lasciare semplicemente che lo schema cambi come desidera, in modo che io possa registrare il mio DataFrame, a prescindere da tutto?<\/p>\n<p>Come dice un vecchio proverbio, 'un'oncia di prevenzione vale un chilo di cura'. A un certo punto, se non ti prendi cura di applicare il tuo schema, i problemi di compatibilit\u00e0 dei tipi di dati alzeranno la loro testa brutta \u2014 fonti di dati non elaborati che sembrano omogenee possono contenere casi limite, colonne danneggiate, mapping malformati o altre cose spaventose che tormentano nei sogni. L'approccio migliore \u00e8 fermare questi nemici alle porte \u2014 con l'applicazione forzata dello schema \u2014 e affrontarli alla luce del giorno, piuttosto che pi\u00f9 tardi, quando iniziano a vagare nelle oscure profondit\u00e0 del tuo codice di lavoro.<\/p>\n<p>L'applicazione forzata dello schema ti d\u00e0 la certezza che lo schema della tua tabella non cambier\u00e0, a meno che non approvi tu stesso l'eventuale modifica. Questo previene la 'diluizione' dei dati, che pu\u00f2 verificarsi quando nuovi campi vengono aggiunti cos\u00ec frequentemente che tabelle precedentemente preziose e compresse perdono il loro valore e utilit\u00e0 a causa di un'inondazione di dati. Incoraggiandoti a essere intenzionale, stabilire alti standard e aspettarti alta qualit\u00e0, l'applicazione forzata dello schema fa esattamente ci\u00f2 per cui \u00e8 stata progettata: aiutarti a rimanere diligente e mantenere pulite le tue tabelle.<\/p>\n<p>Se dopo ulteriori considerazioni decidi che ti piacerebbe veramente <i>bisogno<\/i> aggiungere un nuovo campo \u2014 nessun problema, di seguito troverai una soluzione in una riga. La soluzione \u00e8 l'evoluzione dello schema!<\/p>\n<h2>Che cos'\u00e8 l'evoluzione dello schema?<\/h2>\n<p>\nL'evoluzione dello schema \u00e8 una funzione che consente agli utenti di modificare facilmente l'attuale schema di una tabella in base ai dati che cambiano nel tempo. Di solito viene utilizzata durante le operazioni di aggiunta o sovrascrittura, per adattare automaticamente lo schema all'inclusione di uno o pi\u00f9 nuovi campi.<\/p>\n<h2>Come funziona l'evoluzione dello schema?<\/h2>\n<p>\nSeguendo l'esempio della sezione precedente, gli sviluppatori possono facilmente utilizzare l'evoluzione dello schema per aggiungere nuovi campi che erano stati precedentemente rifiutati a causa di incoerenze 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 diagramma, esegui la seguente query SQL di Spark<\/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 e 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 l'intera sessione Spark aggiungendo <code>spark.databricks.delta.schema.autoMerge = True<\/code> nella configurazione di Spark. Ma usalo con cautela, poich\u00e9 l'applicazione forzata dello schema non ti avviser\u00e0 pi\u00f9 di incoerenze involontarie con lo schema.<\/p>\n<p>Abilitando il parametro nella query <code>mergeSchema<\/code>, tutte le colonne presenti nel DataFrame, ma assenti nella tabella di destinazione, vengono automaticamente aggiunte alla fine dello schema nell'ambito della transazione di scrittura. Anche i campi nidificati possono essere aggiunti, e verranno anch'essi aggiunti alla fine delle colonne di struttura corrispondenti.<\/p>\n<p>Gli ingegneri e i ricercatori possono utilizzare questa opzione per aggiungere nuove colonne (come una nuova metrica tracciata di recente o una colonna delle vendite di questo mese) alle loro tabelle di produzione esistenti per il machine learning, senza interrompere i modelli esistenti basati sulle colonne pi\u00f9 vecchie. <\/p>\n<p>I seguenti tipi di modifiche allo schema sono ammesse nell'ambito dell'evoluzione dello schema durante l'aggiunta o la riscrittura di tabelle:<\/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 elevazione da ByteType -&gt; ShortType -&gt; IntegerType<\/li>\n<\/ul>\n<p>\nAltre modifiche non ammesse nell'ambito dell'evoluzione dello schema richiedono che lo schema e i dati siano riscritti tramite l'aggiunta <code>.option(\"overwriteSchema\", \"true\")<\/code>. Ad esempio, nel caso in cui la colonna \"Foo\" fosse inizialmente un tipo intero e il nuovo schema sarebbe stato un tipo di dati stringa, allora tutti i file Parquet (dati) avrebbero dovuto essere riscritti. Tali 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 il rilascio successivo di Spark 3.0 sar\u00e0 completamente supportato il DDL esplicito (utilizzando ALTER TABLE), permettendo agli utenti di eseguire le seguenti azioni 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 determinano il comportamento della tabella, come impostare la durata di conservazione del log 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 in qualsiasi momento in cui tu <i>intenda<\/i> modificare lo schema della tua tabella (a differenza dei casi in cui hai accidentalmente aggiunto colonne al tuo DataFrame che non dovrebbero esserci). Questo \u00e8 il modo pi\u00f9 semplice per migrare il tuo 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 tutte le nuove colonne o altre modifiche allo schema che non sono compatibili con la tua tabella. Stabilendo e mantenendo questi elevati standard, analisti e ingegneri possono fare affidamento sul fatto che i loro dati hanno il massimo livello di integrit\u00e0, riflettendo su di esso in modo chiaro e preciso, permettendo loro di prendere decisioni aziendali pi\u00f9 efficaci.<\/p>\n<p>D'altra parte, l'evoluzione dello schema integra l'applicazione forzata, semplificando <i>modifiche automatiche<\/i> presunte dello schema. In fin dei conti, non dovrebbe essere una complicazione \u2014 aggiungere una colonna.<\/p>\n<p>L'applicazione forzata dello schema \u00e8 lo yang, mentre l'evoluzione dello schema \u00e8 lo yin. Usati insieme, queste funzionalit\u00e0 semplificano pi\u00f9 che mai il filtraggio del rumore e la sintonizzazione del segnale.<\/p>\n<p><i>Desideriamo anche ringraziare Mukula Murti 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\">Approfondimento su Delta Lake: decodifica del 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=\"Riproduci 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 aziendale con Delta Lake<\/a><\/noindex><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/discover\/data-lakes\/introduction\">Che 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.0.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.0.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\udd47Immersion in Delta Lake: applicazione forzata ed 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}]}}