{"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\/es\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy","title":{"rendered":"Sumergirse en Delta Lake: aplicaci\u00f3n forzada y evoluci\u00f3n del esquema","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>\u00a1Hola, Habr! Les presento la traducci\u00f3n del art\u00edculo <noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/09\/24\/diving-into-delta-lake-schema-enforcement-evolution.html\">\u00abSumergi\u00e9ndonos en Delta Lake: Ejecuci\u00f3n y Evoluci\u00f3n de Esquemas\u00bb<\/a><\/noindex> de los autores Burak Yavuz, Brenner Heintz y Denny Lee, que fue preparado en anticipaci\u00f3n al inicio del curso <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/J1P5\/\">\u00abIngeniero de Datos\u00bb<\/a><\/noindex> de OTUS.<\/b><\/i><\/p>\n<p><img decoding=\"async\" alt=\"Sumergirse en Delta Lake: aplicaci\u00f3n forzada y evoluci\u00f3n del esquema\" src=\"\/wp-content\/uploads\/2020\/05\/1d20921d8d4a1c1e0f8afee4fc019024.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Los datos, al igual que nuestra experiencia, se acumulan y evolucionan constantemente. Para no quedarnos atr\u00e1s, nuestros modelos mentales del mundo deben adaptarse a nuevos datos, algunos de los cuales contienen nuevas dimensiones: nuevas formas de observar cosas que antes no comprend\u00edamos. Estos modelos mentales son poco diferentes de los esquemas de tablas que determinan c\u00f3mo clasificamos y procesamos nueva informaci\u00f3n.<\/p>\n<p>Esto nos lleva a la cuesti\u00f3n de la gesti\u00f3n de esquemas. A medida que las tareas y requisitos empresariales cambian con el tiempo, tambi\u00e9n lo hace la estructura de sus datos. Delta Lake permite implementar nuevas dimensiones a medida que los datos cambian. Los usuarios tienen acceso a una sem\u00e1ntica sencilla para gestionar los esquemas de sus tablas. Estas herramientas incluyen la aplicaci\u00f3n forzada de esquemas (Schema Enforcement), que protege a los usuarios de la contaminaci\u00f3n involuntaria de sus tablas con errores o datos innecesarios, as\u00ed como la evoluci\u00f3n de esquemas (Schema Evolution), que permite agregar autom\u00e1ticamente nuevas columnas con datos valiosos en los lugares correspondientes. En este art\u00edculo, profundizaremos en el uso de estas herramientas.<\/p>\n<h2>Comprendiendo los esquemas de tablas<\/h2>\n<p>\nCada DataFrame en Apache Spark contiene un esquema que define la forma de los datos, como los tipos de datos, las columnas y los metadatos. Con Delta Lake, el esquema de la tabla se almacena en formato JSON dentro del registro de transacciones.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>\u00bfQu\u00e9 es la aplicaci\u00f3n forzada de esquemas?<\/h2>\n<p>\nLa aplicaci\u00f3n forzada de esquemas (Schema Enforcement), tambi\u00e9n conocida como validaci\u00f3n de esquema (Schema Validation), es un mecanismo de protecci\u00f3n en Delta Lake que garantiza la calidad de los datos al rechazar registros que no cumplen con el esquema de la tabla. Al igual que una anfitriona en el mostrador de un restaurante popular que solo acepta reservas, verifica si cada columna de datos ingresados en la tabla est\u00e1 en la lista correspondiente de columnas esperadas (en otras palabras, si cada una tiene \u00abreserva\u00bb), y rechaza cualquier registro con columnas que no est\u00e1n en la lista.<\/p>\n<h2>\u00bfC\u00f3mo funciona la aplicaci\u00f3n forzada de esquemas?<\/h2>\n<p>\nDelta Lake utiliza la validaci\u00f3n de esquemas al escribir, lo que significa que todas las nuevas entradas en la tabla se comprueban para garantizar su compatibilidad con el esquema de la tabla de destino en el momento de la escritura. Si el esquema no es compatible, Delta Lake revierte completamente la transacci\u00f3n (los datos no se escriben) y genera una excepci\u00f3n para informar al usuario sobre la discrepancia.<br \/>\nPara determinar la compatibilidad de la escritura con la tabla, Delta Lake utiliza las siguientes reglas. DataFrame a escribir:<\/p>\n<ul>\n<li>no puede contener columnas adicionales que no existan en el esquema de la tabla de destino. Y viceversa, est\u00e1 bien si los datos entrantes no contienen todas las columnas de la tabla; estas columnas simplemente se establecer\u00e1n en valores nulos.<\/li>\n<li>no puede tener tipos de datos de columnas que difieran de los tipos de datos de las columnas en la tabla de destino. Si una columna de la tabla de destino contiene datos de tipo StringType, pero la columna correspondiente en el DataFrame contiene datos de tipo IntegerType, la aplicaci\u00f3n forzada del esquema generar\u00e1 una excepci\u00f3n y evitar\u00e1 que se realice la operaci\u00f3n de escritura.<\/li>\n<li>no puede contener nombres de columnas que solo se diferencien por el uso de may\u00fasculas y min\u00fasculas. Esto significa que no puede tener columnas llamadas 'Foo' y 'foo' definidas en la misma tabla. Aunque Spark se puede utilizar en un modo sensible o insensible (por defecto) a las may\u00fasculas, Delta Lake conserva el registro pero es insensible en el manejo del esquema. Parquet es sensible al registro al almacenar y recuperar informaci\u00f3n de columna. Para evitar posibles errores, da\u00f1os a los datos o su p\u00e9rdida (con lo que nosotros personalmente nos hemos encontrado en Databricks), decidimos a\u00f1adir esta restricci\u00f3n.<\/li>\n<\/ul>\n<p>\nPara ilustrar esto, observemos lo que sucede en el siguiente c\u00f3digo al intentar agregar algunas columnas generadas recientemente a una tabla Delta Lake que a\u00fan no ha sido configurada para aceptarlas.<\/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>\nEn lugar de agregar autom\u00e1ticamente nuevas columnas, Delta Lake impone el esquema y detiene la escritura. Para ayudar a determinar qu\u00e9 columna (o columnas) est\u00e1 causando la discrepancia, Spark imprime ambos esquemas de la traza de pila para su comparaci\u00f3n.<\/p>\n<h2>\u00bfCu\u00e1l es el beneficio de la aplicaci\u00f3n forzada del esquema?<\/h2>\n<p>\nDado que la aplicaci\u00f3n forzada del esquema implica un control bastante estricto, se convierte en una excelente herramienta para servir como guardi\u00e1n de un conjunto de datos limpio y completamente transformado, listo para la producci\u00f3n o el consumo. Por lo general, se aplica a tablas que presentan datos directamente:<\/p>\n<ul>\n<li>Algoritmos de aprendizaje autom\u00e1tico<\/li>\n<li>Tableros de BI<\/li>\n<li>An\u00e1lisis de datos y herramientas de visualizaci\u00f3n<\/li>\n<li>Cualquier sistema de producci\u00f3n que requiera esquemas sem\u00e1nticos rigurosamente estructurados y tipados.<\/li>\n<\/ul>\n<p>\nPara preparar sus datos para esta barrera final, muchos usuarios utilizan una arquitectura de 'multi-hop' simple, que gradualmente imprime estructura a sus tablas. Para saber m\u00e1s sobre esto, puede consultar el art\u00edculo <noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/14\/productionizing-machine-learning-with-delta-lake.html\">Machine Learning a nivel de producci\u00f3n con Delta Lake.<\/a><\/noindex><\/p>\n<p>Por supuesto, la aplicaci\u00f3n forzada del esquema se puede usar en cualquier parte de su pipeline, pero tenga en cuenta que la escritura fluida en la tabla en ese caso puede ser frustrante, debido a que, por ejemplo, olvid\u00f3 que agreg\u00f3 otra columna a los datos de entrada.<\/p>\n<h2>Prevenci\u00f3n de la diluci\u00f3n de datos<\/h2>\n<p>\nEn este punto, puede que se pregunte, \u00bfcu\u00e1l es todo este alboroto? Despu\u00e9s de todo, a veces, un error inesperado de 'no coincidencia de esquema' puede poner un tropiezo en su flujo de trabajo, especialmente si es nuevo en Delta Lake. \u00bfPor qu\u00e9 simplemente no permitir que el esquema cambie como sea necesario para que pueda escribir mi DataFrame, sin importar qu\u00e9?<\/p>\n<p>Como dice un viejo refr\u00e1n, 'una onza de prevenci\u00f3n vale una libra de cura'. En alg\u00fan momento, si no se ocupa de la aplicaci\u00f3n de su esquema, surgir\u00e1n problemas de compatibilidad de tipos de datos \u2014 fuentes de datos en bruto que parecen homog\u00e9neas pueden contener casos l\u00edmite, columnas corruptas, mapeos mal formados u otras cosas horrorosas que asustan en las pesadillas. El mejor enfoque es detener a estos enemigos en la puerta \u2014 mediante la aplicaci\u00f3n forzada del esquema \u2014 y enfrentarlos a la luz del d\u00eda, y no m\u00e1s tarde, cuando comiencen a merodear en las oscuras profundidades de su c\u00f3digo de trabajo.<\/p>\n<p>La aplicaci\u00f3n forzada del esquema garantiza que el esquema de su tabla no cambiar\u00e1 a menos que usted mismo confirme una variaci\u00f3n. Esto previene la \"diluci\u00f3n\" de los datos, que puede ocurrir cuando se a\u00f1aden columnas nuevas tan a menudo que tablas previamente valiosas y compactas pierden su significado y utilidad debido a la sobrecarga de datos. Alentarle a ser intencional, establecer altos est\u00e1ndares y esperar alta calidad, la aplicaci\u00f3n forzada del esquema hace exactamente lo que fue dise\u00f1ado para hacer: ayudarle a mantenerse diligente y a sus tablas a estar limpias.<\/p>\n<p>Si tras reconsiderarlo usted decide que realmente <i>necesitan<\/i> desea a\u00f1adir una nueva columna, no hay problema, a continuaci\u00f3n se presenta una soluci\u00f3n de una sola l\u00ednea. \u00a1La soluci\u00f3n es la evoluci\u00f3n del esquema!<\/p>\n<h2>\u00bfQu\u00e9 es la evoluci\u00f3n del esquema?<\/h2>\n<p>\nLa evoluci\u00f3n del esquema es una funci\u00f3n que permite a los usuarios modificar f\u00e1cilmente el esquema actual de la tabla conforme los datos cambian con el tiempo. Se utiliza con mayor frecuencia al ejecutar operaciones de adici\u00f3n o sobrescritura para adaptar autom\u00e1ticamente el esquema para incluir una o varias columnas nuevas.<\/p>\n<h2>\u00bfC\u00f3mo funciona la evoluci\u00f3n del esquema?<\/h2>\n<p>\nSiguiendo el ejemplo de la secci\u00f3n anterior, los desarrolladores pueden usar f\u00e1cilmente la evoluci\u00f3n del esquema para agregar nuevas columnas que anteriormente fueron rechazadas por no coincidir con el esquema. La evoluci\u00f3n del esquema se activa a\u00f1adiendo <code>.option('mergeSchema', 'true')<\/code> a su comando de 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>\nPara ver el esquema, ejecute la siguiente consulta de 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=\"Sumergirse en Delta Lake: aplicaci\u00f3n forzada y evoluci\u00f3n del esquema\" src=\"\/wp-content\/uploads\/2020\/05\/873ce67da00f69696d5b9328bd90793a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAlternativamente, puede establecer esta opci\u00f3n para toda la sesi\u00f3n de Spark a\u00f1adiendo <code>spark.databricks.delta.schema.autoMerge = True<\/code> a la configuraci\u00f3n de Spark. Pero tenga cuidado, ya que la aplicaci\u00f3n forzada del esquema ya no le advertir\u00e1 sobre discrepancias inesperadas con el esquema.<\/p>\n<p>Al incluir el par\u00e1metro en la consulta <code>mergeSchema<\/code>, todas las columnas presentes en el DataFrame pero que faltan en la tabla objetivo se a\u00f1adir\u00e1n autom\u00e1ticamente al final del esquema dentro de la transacci\u00f3n de escritura. Tambi\u00e9n se pueden a\u00f1adir campos anidados, y estos tambi\u00e9n se a\u00f1adir\u00e1n al final de las columnas correspondientes de la estructura.<\/p>\n<p>Las fechas que los ingenieros y cient\u00edficos pueden utilizar esta opci\u00f3n para agregar nuevas columnas (posiblemente una m\u00e9trica recientemente rastreada o una columna de indicadores de ventas de este mes) a sus tablas de producci\u00f3n de aprendizaje autom\u00e1tico existentes, sin alterar los modelos existentes basados en columnas antiguas. <\/p>\n<p>Los siguientes tipos de cambios de esquema son permitidos dentro de la evoluci\u00f3n del esquema al agregar o sobrescribir tablas:<\/p>\n<ul>\n<li>Agregar nuevas columnas (este es el escenario m\u00e1s com\u00fan)<\/li>\n<li>Cambiar tipos de datos de NullType -&gt; cualquier otro tipo o elevar de ByteType -&gt; ShortType -&gt; IntegerType<\/li>\n<\/ul>\n<p>\nOtros cambios no permitidos dentro de la evoluci\u00f3n del esquema requieren que el esquema y los datos sean sobrescritos mediante adici\u00f3n <code>.option(\"overwriteSchema\", \"true\")<\/code>. Por ejemplo, en el caso de que la columna 'Foo' originalmente fuera un entero, y el nuevo esquema fuera un tipo de dato de cadena, entonces todos los archivos Parquet (datos) tendr\u00edan que ser sobrescritos. Estos cambios incluyen:<\/p>\n<ul>\n<li>eliminar una columna<\/li>\n<li>cambiar el tipo de dato de una columna existente (en el lugar)<\/li>\n<li>renombrar columnas que solo difieren en may\u00fasculas y min\u00fasculas (por ejemplo, 'Foo' y 'foo')<\/li>\n<\/ul>\n<p>\nFinalmente, con la pr\u00f3xima versi\u00f3n de Spark 3.0 se admitir\u00e1 completamente el DDL expl\u00edcito (utilizando ALTER TABLE), lo que permitir\u00e1 a los usuarios realizar las siguientes acciones sobre los esquemas de las tablas:<\/p>\n<ul>\n<li>agregar columnas<\/li>\n<li>cambiar comentarios en las columnas<\/li>\n<li>ajustar propiedades de la tabla que determinan el comportamiento de la tabla, como establecer la duraci\u00f3n de almacenamiento del registro de transacciones.<\/li>\n<\/ul>\n<p><\/p>\n<h2>\u00bfCu\u00e1l es el beneficio de la evoluci\u00f3n del esquema?<\/h2>\n<p>\nLa evoluci\u00f3n del esquema se puede utilizar siempre que usted <i>tiene la intenci\u00f3n de<\/i> cambiar el esquema de su tabla (en contraste con los casos en que accidentalmente agreg\u00f3 columnas a su DataFrame que no deber\u00edan estar all\u00ed). Esta es la forma m\u00e1s sencilla de migrar su esquema, ya que agrega autom\u00e1ticamente los nombres de columnas y tipos de datos correctos sin necesidad de declararlos expl\u00edcitamente.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>\nLa aplicaci\u00f3n forzada del esquema rechaza cualquier nueva columna u otro cambio en el esquema que no sea compatible con su tabla. Al establecer y mantener estos altos est\u00e1ndares, los analistas e ingenieros pueden confiar en que sus datos tienen el m\u00e1s alto nivel de integridad, razonando esto de forma clara y precisa, lo que les permite tomar decisiones empresariales m\u00e1s efectivas.<\/p>\n<p>Por otro lado, la evoluci\u00f3n del esquema complementa la aplicaci\u00f3n forzada, simplificando <i>los cambios<\/i> autom\u00e1ticos del esquema. Al final, no deber\u00eda ser complicado: agregar una columna.<\/p>\n<p>La aplicaci\u00f3n forzada del esquema es el yin, mientras que la evoluci\u00f3n del esquema es el yang. Cuando se utilizan juntas, estas funciones simplifican m\u00e1s que nunca la supresi\u00f3n de ruido y la sintonizaci\u00f3n de se\u00f1ales.<\/p>\n<p><i>Tambi\u00e9n nos gustar\u00eda agradecer a Mukul Murti y Pranav Anand por su contribuci\u00f3n a este art\u00edculo.<\/i><\/p>\n<p>Otros art\u00edculos de esta 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\">Sumergirse en Delta Lake: desglosando el registro de transacciones<\/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=\"Reproducir 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>Art\u00edculos relacionados<\/h2>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/blog\/2019\/08\/14\/productionizing-machine-learning-with-delta-lake.html\">Aprendizaje autom\u00e1tico a nivel empresarial con Delta Lake<\/a><\/noindex><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/databricks.com\/discover\/data-lakes\/introduction\">\u00bfQu\u00e9 es un lago de datos?<\/a><\/noindex><\/p>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/J1P5\/\">Conocer m\u00e1s sobre el curso<\/a><\/noindex><\/p>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/502324\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u00abDiving Into Delta Lake: Schema Enforcement &amp; Evolution\u00bb \u0430\u0432\u0442\u043e\u0440\u043e\u0432 Burak Yavuz, Brenner Heintz and Denny Lee, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430 \u00abData Engineer\u00bb \u043e\u0442 OTUS. \u0414\u0430\u043d\u043d\u044b\u0435, \u043a\u0430\u043a \u0438 \u043d\u0430\u0448 \u043e\u043f\u044b\u0442, \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0442\u0441\u044f. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0442\u0441\u0442\u0430\u0432\u0430\u0442\u044c, \u043d\u0430\u0448\u0438 \u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u0438\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a \u043d\u043e\u0432\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":82039,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-82038","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47Sumergirse en Delta Lake: aplicaci\u00f3n forzada y evoluci\u00f3n del esquema | ProHoster","description":"\u00a1Hola, Habr!","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/pogruzhenie-v-delta-lake-prinuditelnoe-primenenie-i-evolyucziya-shemy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/82038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=82038"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/82038\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/82039"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=82038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=82038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=82038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}