<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-6170654049139790453</atom:id><lastBuildDate>Fri, 03 Apr 2026 11:48:45 +0000</lastBuildDate><category>Curso de Big Data</category><category>Introducción a Big Data</category><category>Big Data</category><category>Ciencia de Datos</category><category>Introducción a Hadoop</category><category>Spark</category><category>Big Data Management</category><category>Modelado de Datos</category><category>Data Ingestion</category><category>Python</category><category>Kafka</category><category>Fundamentos informáticos de Big Data</category><category>NoSQL</category><category>AWS</category><category>Cloudera</category><category>Machine Learning</category><category>Tuning</category><category>Anaconda</category><category>CLI</category><category>Coaching</category><category>Fraude</category><category>GIT</category><category>HDFS</category><category>HDPCA</category><category>HQL</category><category>Hive</category><category>Inteligencia Artificial</category><category>Kinesis</category><category>Logs</category><category>Notebook</category><category>Optimization</category><category>S3</category><category>Servicios Financieros</category><category>Streaming</category><category>User Mnagement</category><category>VirtualBox</category><category>Zeppelin</category><title>Observatorio BI &amp;amp; Analytics</title><description>Aprende a medir y optimizar tu negocio</description><link>http://spaceanalytics.blogspot.com/</link><managingEditor>noreply@blogger.com (fglopez)</managingEditor><generator>Blogger</generator><openSearch:totalResults>128</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-7487694637272922251</guid><pubDate>Fri, 04 Jul 2025 22:00:00 +0000</pubDate><atom:updated>2025-07-05T00:00:27.250+02:00</atom:updated><title>La deshumanización de la IA</title><description>&lt;p&gt;Vivimos tiempos de un fervor desmedido por la inteligencia artificial. Sus promesas se gritan en todos los foros: automatización, eficiencia, velocidad. Pero, ¿a qué precio? Tras esa fachada de progreso y soluciones instantáneas se oculta un proceso silencioso de deshumanización que afecta, ante todo, a quienes sostienen en sus hombros la solidez de los proyectos: los ingenieros senior.&lt;/p&gt;&lt;p&gt;Las consultoras han encontrado en la IA un arma de doble filo. La utilizan para justificar la imposición de &lt;b&gt;tiempos de entrega imposibles&lt;/b&gt;, argumentando que “&lt;i&gt;la IA te lo hace todo&lt;/i&gt;”. Pero la realidad es muy distinta. La IA comete errores, su salida es aproximada, a veces incluso absurda o dañina. Es necesaria la revisión, la reflexión y el ajuste experto para transformar sus propuestas en soluciones reales. Sin embargo, las empresas ya no quieren oír hablar de reflexión ni de maduración conceptual. Quieren resultados en tres semanas. Sprint tras sprint. Ciclos sin pausa que convierten al ingeniero en un ratón atrapado en una rueda que no cesa de girar, mientras su cuerpo y su mente piden descanso y su dignidad clama por ser reconocida.&lt;/p&gt;&lt;p&gt;La IA, tal como se implementa hoy, &lt;b&gt;no es una herramienta formativa para las nuevas generaciones&lt;/b&gt;. Los ingenieros junior, al estar aún en su etapa de aprendizaje, no siempre tienen la experiencia suficiente para evaluar la validez de lo que la IA propone. Requieren un proceso humano de enseñanza, razonamiento y error guiado que la IA no proporciona. Así, la carga se traslada inexorablemente a los seniors, que deben ejercer de revisores, arquitectos y escudos ante los fallos. Su jornada se convierte en una sucesión de soluciones superficiales que deben recomponer en silencio para salvar la entrega.&lt;/p&gt;&lt;p&gt;Mientras tanto, &lt;b&gt;la creatividad se asfixia&lt;/b&gt;. Ya no hay espacio para pensar de forma original, para innovar o para debatir. La IA ofrece respuestas inmediatas que se convierten en la verdad sin discusión, aunque sean erróneas, aunque carezcan de contexto. El ingeniero pasa de ser un creador a un corrector, de un pensador a un ejecutor, de un arquitecto de soluciones a un editor de ocurrencias generadas por un algoritmo estadístico entrenado en datos mediocres.&lt;/p&gt;&lt;p&gt;Y así, el círculo vicioso se cierra: los seniors, agotados y desencantados, se irán. Se jubilarán. Buscarán otros caminos. Y los juniors, sin haber recibido la formación y la práctica necesarias para desarrollar su criterio y su pensamiento crítico, no podrán suplirlos. Nos quedaremos con respuestas automáticas y sin mentes capaces de cuestionarlas. La IA solo es útil en manos de expertos, pero si no cultivamos nuevos expertos, la utilidad misma de la IA quedará sepultada en un desierto de respuestas no comprendidas.&lt;/p&gt;&lt;p&gt;Estamos ante la era de la inmediatez, donde el progreso tecnológico corre más rápido que la ética, donde se exalta la máquina y se olvida al humano, donde se produce sin pensar y se decide sin razonar.&lt;/p&gt;&lt;p&gt;&lt;b&gt;La deshumanización de la IA no radica en que sea fría o mecánica. Radica en que nos obliga a serlo a nosotros.&lt;/b&gt;&lt;/p&gt;</description><link>http://spaceanalytics.blogspot.com/2025/07/la-deshumanizacion-de-la-ia.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-9130830229126178423</guid><pubDate>Fri, 15 Nov 2024 10:36:00 +0000</pubDate><atom:updated>2024-11-15T19:07:06.322+01:00</atom:updated><title>Guía Desarrollo Spark</title><description>&lt;p&gt;&amp;nbsp;Funciones de Array de Spark SQL&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sparkbyexamples.com/spark/spark-sql-array-functions/&quot;&gt;https://sparkbyexamples.com/spark/spark-sql-array-functions/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Funciones de Map de Spark SQL&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sparkbyexamples.com/spark/spark-sql-map-functions/&quot;&gt;https://sparkbyexamples.com/spark/spark-sql-map-functions/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Funciones de primer orden&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.databricks.com/en/semi-structured/higher-order-functions.html&quot;&gt;https://docs.databricks.com/en/semi-structured/higher-order-functions.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Funciones integradas en Spark SQL&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sparkbyexamples.com/spark/spark-sql-functions/#google_vignette&quot;&gt;https://sparkbyexamples.com/spark/spark-sql-functions/#google_vignette&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Tipos de Join en Spark SQL&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sparkbyexamples.com/spark/spark-sql-dataframe-join/#sql-full-outer-join&quot;&gt;https://sparkbyexamples.com/spark/spark-sql-dataframe-join/#sql-full-outer-join&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Funciones de Ventana&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sparkbyexamples.com/spark/spark-sql-window-functions/&quot;&gt;https://sparkbyexamples.com/spark/spark-sql-window-functions/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Pivotado de un DataFrame Spark&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sparkbyexamples.com/spark/how-to-pivot-table-and-unpivot-a-spark-dataframe/&quot;&gt;https://sparkbyexamples.com/spark/how-to-pivot-table-and-unpivot-a-spark-dataframe/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Spark Performance Tuning&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sparkbyexamples.com/spark/spark-performance-tuning/&quot;&gt;https://sparkbyexamples.com/spark/spark-performance-tuning/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Spark SQL Performance Tuning by Configurations&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sparkbyexamples.com/spark/spark-sql-performance-tuning-configurations/&quot;&gt;https://sparkbyexamples.com/spark/spark-sql-performance-tuning-configurations/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description><link>http://spaceanalytics.blogspot.com/2024/11/glosario-desarrollo-spark.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-8593745249367884343</guid><pubDate>Mon, 04 Sep 2023 11:11:00 +0000</pubDate><atom:updated>2023-09-04T13:11:53.866+02:00</atom:updated><title>Tabla de Monitorización de tareas semanales</title><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2 style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; line-height: 1.33333; margin: 2rem 0px 1rem; white-space-collapse: preserve;&quot;&gt;Septiembre 2023&lt;/h2&gt;&lt;table style=&quot;--tw-border-spacing-x: 0px; --tw-border-spacing-y: 0px; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border-color: inherit; border-image: initial; border-spacing: var(--tw-border-spacing-x) var(--tw-border-spacing-y); border-style: solid; border-width: 0px; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 0.875em; line-height: 1.71429; margin-bottom: 2em; margin-top: 0px; table-layout: auto; text-indent: 0px; white-space-collapse: preserve; width: 653px;&quot;&gt;&lt;thead style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-th-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box;&quot;&gt;&lt;th style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(236, 236, 241, 0.2); border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-top-left-radius: 0.375rem; border-width: 1px 0px 1px 1px; box-sizing: border-box; color: var(--tw-prose-headings); padding: 0.25rem 0.75rem; vertical-align: bottom;&quot;&gt;Semana&lt;/th&gt;&lt;th style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(236, 236, 241, 0.2); border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 1px 0px 1px 1px; box-sizing: border-box; color: var(--tw-prose-headings); padding: 0.25rem 0.75rem; vertical-align: bottom;&quot;&gt;Miembro Asignado&lt;/th&gt;&lt;th style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(236, 236, 241, 0.2); border-top-right-radius: 0.375rem; border: 1px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); padding: 0.25rem 0.75rem; vertical-align: bottom;&quot;&gt;Tarea Completada (✓/✗)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;1 - 7 Sept&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Ana&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;✓&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;8 - 14 Sept&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Carlos&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;✓&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;15 - 21 Sept&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Beatriz&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-left-radius: 0.375rem; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;22 - 28 Sept&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Diego&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-right-radius: 0.375rem; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border-bottom-width: 0px; border-color: var(--tw-prose-hr); border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: solid; box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; height: 0px; margin: 3em 0px; white-space-collapse: preserve;&quot; /&gt;&lt;h2 style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; line-height: 1.33333; margin: 2rem 0px 1rem; white-space-collapse: preserve;&quot;&gt;Octubre 2023&lt;/h2&gt;&lt;table style=&quot;--tw-border-spacing-x: 0px; --tw-border-spacing-y: 0px; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border-color: inherit; border-image: initial; border-spacing: var(--tw-border-spacing-x) var(--tw-border-spacing-y); border-style: solid; border-width: 0px; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 0.875em; line-height: 1.71429; margin-bottom: 2em; margin-top: 0px; table-layout: auto; text-indent: 0px; white-space-collapse: preserve; width: 653px;&quot;&gt;&lt;thead style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-th-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box;&quot;&gt;&lt;th style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(236, 236, 241, 0.2); border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-top-left-radius: 0.375rem; border-width: 1px 0px 1px 1px; box-sizing: border-box; color: var(--tw-prose-headings); padding: 0.25rem 0.75rem; vertical-align: bottom;&quot;&gt;Semana&lt;/th&gt;&lt;th style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(236, 236, 241, 0.2); border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 1px 0px 1px 1px; box-sizing: border-box; color: var(--tw-prose-headings); padding: 0.25rem 0.75rem; vertical-align: bottom;&quot;&gt;Miembro Asignado&lt;/th&gt;&lt;th style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(236, 236, 241, 0.2); border-top-right-radius: 0.375rem; border: 1px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); padding: 0.25rem 0.75rem; vertical-align: bottom;&quot;&gt;Tarea Completada (✓/✗)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;1 - 7 Oct&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Elena&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;8 - 14 Oct&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Francisco&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;15 - 21 Oct&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Ana&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-left-radius: 0.375rem; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;22 - 28 Oct&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Carlos&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-right-radius: 0.375rem; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border-bottom-width: 0px; border-color: var(--tw-prose-hr); border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: solid; box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; height: 0px; margin: 3em 0px; white-space-collapse: preserve;&quot; /&gt;&lt;h2 style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; line-height: 1.33333; margin: 2rem 0px 1rem; white-space-collapse: preserve;&quot;&gt;Noviembre 2023&lt;/h2&gt;&lt;table style=&quot;--tw-border-spacing-x: 0px; --tw-border-spacing-y: 0px; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border-color: inherit; border-image: initial; border-spacing: var(--tw-border-spacing-x) var(--tw-border-spacing-y); border-style: solid; border-width: 0px; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 0.875em; line-height: 1.71429; margin-bottom: 2em; margin-top: 0px; table-layout: auto; text-indent: 0px; white-space-collapse: preserve; width: 653px;&quot;&gt;&lt;thead style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-th-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box;&quot;&gt;&lt;th style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(236, 236, 241, 0.2); border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-top-left-radius: 0.375rem; border-width: 1px 0px 1px 1px; box-sizing: border-box; color: var(--tw-prose-headings); padding: 0.25rem 0.75rem; vertical-align: bottom;&quot;&gt;Semana&lt;/th&gt;&lt;th style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(236, 236, 241, 0.2); border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 1px 0px 1px 1px; box-sizing: border-box; color: var(--tw-prose-headings); padding: 0.25rem 0.75rem; vertical-align: bottom;&quot;&gt;Miembro Asignado&lt;/th&gt;&lt;th style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(236, 236, 241, 0.2); border-top-right-radius: 0.375rem; border: 1px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); padding: 0.25rem 0.75rem; vertical-align: bottom;&quot;&gt;Tarea Completada (✓/✗)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;1 - 7 Nov&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Beatriz&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;8 - 14 Nov&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Diego&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;15 - 21 Nov&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Elena&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-left-radius: 0.375rem; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;22 - 28 Nov&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Francisco&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-right-radius: 0.375rem; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border-bottom-width: 0px; border-color: var(--tw-prose-hr); border-image: initial; border-left-width: 0px; border-right-width: 0px; border-style: solid; box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; height: 0px; margin: 3em 0px; white-space-collapse: preserve;&quot; /&gt;&lt;ul style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; display: flex; flex-direction: column; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1.25em; padding: 0px; white-space-collapse: preserve;&quot;&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600; margin-bottom: 1.25em; margin-top: 1.25em;&quot;&gt;Nota:&lt;/span&gt; Una vez completada la tarea, por favor marque con un &quot;✓&quot; en la columna &quot;Tarea Completada&quot;.&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600; margin-bottom: 1.25em; margin-top: 1.25em;&quot;&gt;Recordatorio:&lt;/span&gt; Si no puedes realizar tu turno, coordina el cambio con un compañero y actualiza el tablón.&lt;/li&gt;&lt;/ul&gt;</description><link>http://spaceanalytics.blogspot.com/2023/09/tabla-de-monitorizacion-de-tareas.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-8440228206805988550</guid><pubDate>Mon, 28 Aug 2023 08:38:00 +0000</pubDate><atom:updated>2023-08-28T10:38:08.280+02:00</atom:updated><title>Plantilla de Peticiones JIRA para Data Engineering</title><description>&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600;&quot;&gt;1. Información Básica:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; display: flex; flex-direction: column; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; list-style-image: initial; list-style-position: initial; margin: 1.25em 0px; padding: 0px; white-space-collapse: preserve;&quot;&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600; margin-bottom: 1.25em; margin-top: 1.25em;&quot;&gt;Título del JIRA:&lt;/span&gt; [Breve descripción del requerimiento o tarea]&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600; margin-bottom: 1.25em; margin-top: 1.25em;&quot;&gt;Tipo de Tarea:&lt;/span&gt; [Análisis, Ingesta, Transformaciones Launcher, Transformaciones Capa Snapshot, Flujo CEFEO, Spark-Lineage/Datahub, Dolphin, Documentación, Otras Tareas Técnicas]&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600;&quot;&gt;2. Descripción Detallada:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; display: flex; flex-direction: column; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; list-style-image: initial; list-style-position: initial; margin: 1.25em 0px; padding: 0px; white-space-collapse: preserve;&quot;&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600; margin-bottom: 1.25em; margin-top: 1.25em;&quot;&gt;Objetivo:&lt;/span&gt; ¿Cuál es el propósito principal de esta tarea? ¿Qué se espera lograr?&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600; margin-bottom: 1.25em; margin-top: 1.25em;&quot;&gt;Contexto:&lt;/span&gt; ¿Por qué es necesaria esta tarea? ¿Hay algún antecedente o situación actual que deba ser conocido?&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600; margin-bottom: 1.25em; margin-top: 1.25em;&quot;&gt;Especificaciones Técnicas:&lt;/span&gt; Detalles técnicos relevantes para la tarea. Por ejemplo, para una ingesta, especificar la fuente de datos, el formato, la frecuencia, etc.&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600;&quot;&gt;3. Recursos y Referencias:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; display: flex; flex-direction: column; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; list-style-image: initial; list-style-position: initial; margin: 1.25em 0px; padding: 0px; white-space-collapse: preserve;&quot;&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600; margin-bottom: 1.25em; margin-top: 1.25em;&quot;&gt;Artefactos de Diseño:&lt;/span&gt; Enlaza directamente a los diseños técnicos, plantillas de ingestas, etc., preferiblemente almacenados en Confluence o en un repositorio centralizado.&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600; margin-bottom: 1.25em; margin-top: 1.25em;&quot;&gt;Referencias Anteriores:&lt;/span&gt; Enlaza a JIRAs relacionados, correos electrónicos, conversaciones de Slack, etc., que puedan proporcionar contexto adicional.&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600;&quot;&gt;4. Herramientas y Servicios AWS Involucrados:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; display: flex; flex-direction: column; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; list-style-image: initial; list-style-position: initial; margin: 1.25em 0px; padding: 0px; white-space-collapse: preserve;&quot;&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600; margin-bottom: 1.25em; margin-top: 1.25em;&quot;&gt;Servicios AWS:&lt;/span&gt; [S3, Athena, Glue, EMR, etc.]&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600; margin-bottom: 1.25em; margin-top: 1.25em;&quot;&gt;Lenguaje de Programación:&lt;/span&gt; [Scala, si es relevante para la tarea]&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600;&quot;&gt;5. Criterios de Aceptación (Definition of Done):&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; display: flex; flex-direction: column; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; list-style-image: initial; list-style-position: initial; margin: 1.25em 0px; padding: 0px; white-space-collapse: preserve;&quot;&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;Enumera los criterios específicos que deben cumplirse para considerar que la tarea está completa. Por ejemplo:&lt;ul style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: flex; flex-direction: column; list-style: disc; margin: 0px 0px 0px 1rem; padding: 0px;&quot;&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;Código desarrollado y revisado.&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;Pruebas unitarias y de integración realizadas.&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;Documentación actualizada.&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;Datos cargados correctamente en S3 (para tareas de ingesta).&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;Transformaciones validadas y datos disponibles en Athena (para tareas de transformación).&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;Etc.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600;&quot;&gt;6. Comentarios Adicionales:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; display: flex; flex-direction: column; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; list-style-image: initial; list-style-position: initial; margin: 1.25em 0px; padding: 0px; white-space-collapse: preserve;&quot;&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;Cualquier otra información o detalle que el equipo deba conocer.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Ejemplo:&lt;/p&gt;&lt;table style=&quot;--tw-border-spacing-x: 0px; --tw-border-spacing-y: 0px; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border-color: inherit; border-image: initial; border-spacing: var(--tw-border-spacing-x) var(--tw-border-spacing-y); border-style: solid; border-width: 0px; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 0.875em; line-height: 1.71429; margin-bottom: 2em; margin-top: 2em; table-layout: auto; text-indent: 0px; white-space-collapse: preserve; width: 653px;&quot;&gt;&lt;thead style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-th-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box;&quot;&gt;&lt;th style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(236, 236, 241, 0.2); border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-top-left-radius: 0.375rem; border-width: 1px 0px 1px 1px; box-sizing: border-box; color: var(--tw-prose-headings); padding: 0.25rem 0.75rem; vertical-align: bottom;&quot;&gt;Campo&lt;/th&gt;&lt;th style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(236, 236, 241, 0.2); border-top-right-radius: 0.375rem; border: 1px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); padding: 0.25rem 0.75rem; vertical-align: bottom;&quot;&gt;Detalle&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600;&quot;&gt;Información Básica&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Título del JIRA&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Ingesta de datos de ventas desde API externa&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Tipo de Tarea&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Ingesta&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600;&quot;&gt;Descripción Detallada&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Objetivo&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Ingestar datos de ventas diarias desde una API externa para análisis en Athena.&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Contexto&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Necesitamos analizar las ventas diarias en comparación con las campañas de marketing.&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Especificaciones Técnicas&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Fuente: API externa (URL proporcionada). Formato: JSON. Frecuencia: Diaria a las 00:00 UTC.&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600;&quot;&gt;Recursos y Referencias&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Artefactos de Diseño&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;[Enlace a Confluence con diseño técnico]&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Referencias Anteriores&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;[Enlace a JIRA relacionado]&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600;&quot;&gt;Herramientas y Servicios AWS&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Servicios AWS&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;S3, Athena, Glue&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Lenguaje de Programación&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Scala&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600;&quot;&gt;Subtareas y Estado&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Subtarea 1&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Desarrollo del código de ingesta 🟢&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Subtarea 2&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Pruebas unitarias 🟡&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Subtarea 3&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Carga de datos en S3 🟢&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Subtarea 4&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Validación en Athena 🟠&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Subtarea 5&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Actualización de documentación 🟡&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600;&quot;&gt;Criterios de Aceptación (Definition of Done)&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Criterio 1&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Código desarrollado y revisado.&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Criterio 2&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Datos cargados correctamente en S3.&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Criterio 3&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Transformaciones validadas y datos disponibles en Athena.&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Criterio 4&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;Documentación actualizada en Confluence.&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px; box-sizing: border-box;&quot;&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-left-radius: 0.375rem; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600;&quot;&gt;Comentarios Adicionales&lt;/span&gt;&lt;/td&gt;&lt;td style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-right-radius: 0.375rem; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;&quot;&gt;La API externa tiene un límite de 10,000 registros por solicitud.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-bold); font-weight: 600;&quot;&gt;Leyenda de Banderas de Colores:&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; display: flex; flex-direction: column; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; list-style-image: initial; list-style-position: initial; margin: 1.25em 0px; padding: 0px; white-space-collapse: preserve;&quot;&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;🟢 Verde: Completado&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;🟡 Amarillo: En progreso&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;🟠 Naranja: Pendiente&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; display: block; margin: 0px; min-height: 28px; padding-left: 0.375em;&quot;&gt;🔴 Rojo: Bloqueado&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><link>http://spaceanalytics.blogspot.com/2023/08/plantilla-de-peticiones-jira-para-data.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-6617097490539258133</guid><pubDate>Mon, 14 Aug 2023 16:13:00 +0000</pubDate><atom:updated>2023-08-14T18:13:25.003+02:00</atom:updated><title>Impresión de esquemas complejos de un Dataframe Spark</title><description>&lt;p&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;La función &lt;/span&gt;&lt;code style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;printSchema&lt;/code&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt; para que sea más general. Ahora acepta cualquier &lt;/span&gt;&lt;code style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;DataType&lt;/code&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt; y un prefijo. Si se encuentra con un &lt;/span&gt;&lt;code style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;StructType&lt;/code&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;, recorre sus campos y llama a &lt;/span&gt;&lt;code style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;printSchema&lt;/code&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt; de nuevo con un nuevo prefijo. Si se encuentra con un &lt;/span&gt;&lt;code style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;ArrayType&lt;/code&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;, llama a &lt;/span&gt;&lt;code style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;printSchema&lt;/code&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt; con el tipo de elemento del array y un nuevo prefijo con &lt;/span&gt;&lt;code style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;[]&lt;/code&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;. Si no es ninguno de esos dos casos, simplemente imprime el prefijo y el tipo.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;Con este enfoque, el programa puede manejar estructuras anidadas complejas, ya sean campos &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600;&quot;&gt;STRUCT&lt;/code&gt; anidados dentro de otros campos &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600;&quot;&gt;STRUCT&lt;/code&gt; o &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600;&quot;&gt;ARRAY&lt;/code&gt;, o campos &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600;&quot;&gt;ARRAY&lt;/code&gt; anidados dentro de campos &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600;&quot;&gt;STRUCT&lt;/code&gt;.&lt;/p&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;background-color: #f7f7f8;&quot;&gt;Para generar un archivo CSV se puede usar la API de Spark para escribir DataFrames en formato CSV.  &lt;/span&gt;&lt;span style=&quot;background-color: #f7f7f8;&quot;&gt;Primero, la función &lt;/span&gt;&lt;code style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600;&quot;&gt;printSchema&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8;&quot;&gt; devuelve una lista de tuplas &lt;/span&gt;&lt;code style=&quot;border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600;&quot;&gt;(campo, tipo)&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8;&quot;&gt;, y luego convertimos esa lista en un DataFrame que finalmente escribimos en formato CSV.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;import org.apache.spark.sql.{SparkSession, DataFrame, Row}
import org.apache.spark.sql.types._

object SchemaExplorer {

  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder
      .appName(&quot;SchemaExplorer&quot;)
      .master(&quot;local[*]&quot;)
      .getOrCreate()

    val df = spark.read.json(&quot;path_a_tu_esquema_json.json&quot;)

    val schemaList = extractSchema(df.schema)
    val outputDf = spark.createDataFrame(schemaList.map(Row.fromTuple), StructType(Seq(
      StructField(&quot;Campo&quot;, StringType, false),
      StructField(&quot;Tipo&quot;, StringType, false)
    )))

    outputDf.write.csv(&quot;path_donde_guardar.csv&quot;)

    spark.stop()
  }

  def extractSchema(dataType: DataType, prefix: String = &quot;&quot;): List[(String, String)] = {
    dataType match {
      case structType: StructType =&amp;gt;
        structType.fields.flatMap { field =&amp;gt;
          val newPrefix = if (prefix.isEmpty) field.name else s&quot;$prefix.${field.name}&quot;
          extractSchema(field.dataType, newPrefix)
        }.toList
      case arrayType: ArrayType =&amp;gt;
        val innerType = arrayType.elementType
        val newPrefix = s&quot;$prefix[]&quot;
        extractSchema(innerType, newPrefix)
      case _ =&amp;gt; List((prefix, dataType.simpleString))
    }
  }
}
&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;Vamos a suponer que tienes un DataFrame con un esquema que tiene un campo &lt;/span&gt;&lt;code style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;users&lt;/code&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt; que es un ARRAY de STRUCT. Cada estructura tiene campos &lt;/span&gt;&lt;code style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;name&lt;/code&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt; y &lt;/span&gt;&lt;code style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;address&lt;/code&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;, donde &lt;/span&gt;&lt;code style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;address&lt;/code&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt; es otro STRUCT con campos &lt;/span&gt;&lt;code style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;street&lt;/code&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt; y &lt;/span&gt;&lt;code style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;zip&lt;/code&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;val data = Seq(
  Row(Seq(Row(&quot;John&quot;, Row(&quot;123 Main St&quot;, &quot;12345&quot;)), Row(&quot;Jane&quot;, Row(&quot;456 Elm St&quot;, &quot;67890&quot;))))
)
val addressSchema = StructType(Seq(
  StructField(&quot;street&quot;, StringType, false),
  StructField(&quot;zip&quot;, StringType, false)
))
val userSchema = StructType(Seq(
  StructField(&quot;name&quot;, StringType, false),
  StructField(&quot;address&quot;, addressSchema, false)
))
val schema = StructType(Seq(
  StructField(&quot;users&quot;, ArrayType(userSchema), false)
))

val df = spark.createDataFrame(spark.sparkContext.parallelize(data), schema)
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;;&quot;&gt;Si ejecutamos el programa &lt;/span&gt;&lt;code style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(0, 0, 0); color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;SchemaExplorer&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;;&quot;&gt; con este DataFrame, la salida sería:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;Campo          Tipo
-------------------------
users[]       StructType
users[].name  StringType
users[].address  StructType
users[].address.street  StringType
users[].address.zip    StringType
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;;&quot;&gt;El programa se da cuenta de que &lt;/span&gt;&lt;code style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(0, 0, 0); color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;users&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;;&quot;&gt; es un ARRAY y, por lo tanto, añade &lt;/span&gt;&lt;code style=&quot;-webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(0, 0, 0); color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;[]&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;;&quot;&gt; a su nombre. A continuación, como el tipo de elemento del ARRAY es un STRUCT, profundiza en sus campos y sigue haciendo lo mismo hasta que haya recorrido todo el esquema.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</description><link>http://spaceanalytics.blogspot.com/2023/08/impresion-de-esquemas-complejos-de-un.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-7783178164402945499</guid><pubDate>Sat, 29 Jul 2023 18:34:00 +0000</pubDate><atom:updated>2023-07-29T20:34:53.529+02:00</atom:updated><title>POO en Scala: traits, mixins y herencia</title><description>&lt;p&gt;&amp;nbsp;&lt;span style=&quot;-webkit-text-size-adjust: 100%; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 17px;&quot;&gt;Object-oriented programming (OOP) is a popular programming paradigm that focuses on creating objects that can interact with each other to achieve specific tasks. Scala is a modern programming language that supports both object-oriented and functional programming paradigms. In this blog, we’ll explore some of the key object-oriented concepts in Scala, including traits, mixins, and inheritance.&lt;/span&gt;&lt;/p&gt;&lt;h2 class=&quot;wp-block-heading&quot; style=&quot;-webkit-text-size-adjust: 100%; border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 30px; font-weight: 400; line-height: 1.2em; margin: 0px 0px 20px; padding: 0px; text-transform: uppercase;&quot;&gt;CLASSES AND OBJECTS&lt;/h2&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 17px; margin: 0px 0px 1.5em; padding: 0px;&quot;&gt;Like other OOP languages, Scala has classes and objects. Classes define the blueprint for creating objects, which are instances of a class. Here’s an example of a simple class in Scala:&lt;/p&gt;&lt;pre class=&quot;wp-block-preformatted&quot; style=&quot;-webkit-text-size-adjust: 100%; background: rgba(0, 0, 0, 0.05); border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: inherit; font-size: 17px; line-height: normal; margin-bottom: 1.5em; margin-top: 0px; max-width: 100%; overflow: auto; padding: 20px; white-space: pre-wrap;&quot;&gt;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;class Person(var name: String, var age: Int) {
  def sayHello(): Unit = {
    println(s&quot;Hello, my name is $name and I&#39;m $age years old.&quot;)
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 17px; margin: 0px 0px 1.5em; padding: 0px;&quot;&gt;This class defines a&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;Person&lt;/code&gt;&amp;nbsp;with a&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;name&lt;/code&gt;&amp;nbsp;and an&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;age&lt;/code&gt;, and a&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;sayHello()&lt;/code&gt;&amp;nbsp;method that prints a greeting message.&lt;/p&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 17px; margin: 0px 0px 1.5em; padding: 0px;&quot;&gt;To create an instance of the&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;Person&lt;/code&gt;&amp;nbsp;class, we can use the&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;new&lt;/code&gt;&amp;nbsp;keyword, like this:&lt;/p&gt;&lt;pre class=&quot;wp-block-preformatted&quot; style=&quot;-webkit-text-size-adjust: 100%; background: rgba(0, 0, 0, 0.05); border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: inherit; font-size: 17px; line-height: normal; margin-bottom: 1.5em; margin-top: 0px; max-width: 100%; overflow: auto; padding: 20px; white-space: pre-wrap;&quot;&gt;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;val person = new Person(&quot;Alice&quot;, 30)&lt;/code&gt;&lt;/pre&gt;&lt;h2 class=&quot;wp-block-heading&quot; style=&quot;-webkit-text-size-adjust: 100%; border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 30px; font-weight: 400; line-height: 1.2em; margin: 0px 0px 20px; padding: 0px; text-transform: uppercase;&quot;&gt;TRAITS&lt;/h2&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 17px; margin: 0px 0px 1.5em; padding: 0px;&quot;&gt;A trait is similar to an interface in Java. It defines a set of methods and fields that a class can implement. However, unlike Java interfaces, a trait can also provide a default implementation for these methods. Here’s an example:&lt;/p&gt;&lt;pre class=&quot;wp-block-preformatted&quot; style=&quot;-webkit-text-size-adjust: 100%; background: rgba(0, 0, 0, 0.05); border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: inherit; font-size: 17px; line-height: normal; margin-bottom: 1.5em; margin-top: 0px; max-width: 100%; overflow: auto; padding: 20px; white-space: pre-wrap;&quot;&gt;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;trait Speaker {
  def speak(message: String): Unit = {
    println(message)
  }
}

class Dog extends Speaker {
  def bark(): Unit = {
    speak(&quot;Woof!&quot;)
  }
}

val dog = new Dog()
dog.bark() // prints &quot;Woof!&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 17px; margin: 0px 0px 1.5em; padding: 0px;&quot;&gt;In this example, we define a trait called&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;Speaker&lt;/code&gt;&amp;nbsp;that has a single method called&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;speak&lt;/code&gt;. We then define a class called&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;Dog&lt;/code&gt;&amp;nbsp;that extends the&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;Speaker&lt;/code&gt;&amp;nbsp;trait and implements the&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;bark&lt;/code&gt;&amp;nbsp;method, which calls the&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;speak&lt;/code&gt;&amp;nbsp;method to output a message.&lt;/p&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 17px; margin: 0px 0px 1.5em; padding: 0px;&quot;&gt;Traits can be mixed in with classes using the&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;with&lt;/code&gt;&amp;nbsp;keyword. For example:&lt;/p&gt;&lt;pre class=&quot;wp-block-preformatted&quot; style=&quot;-webkit-text-size-adjust: 100%; background: rgba(0, 0, 0, 0.05); border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: inherit; font-size: 17px; line-height: normal; margin-bottom: 1.5em; margin-top: 0px; max-width: 100%; overflow: auto; padding: 20px; white-space: pre-wrap;&quot;&gt;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;trait Runner {
  def run(distance: Double): Unit
}

class Athlete(val name: String) extends Runner with Speaker {
  def run(distance: Double): Unit = {
    speak(s&quot;$name is running $distance meters&quot;)
  }
}

val athlete = new Athlete(&quot;John&quot;)
athlete.run(100.0) // prints &quot;John is running 100.0 meters&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 17px; margin: 0px 0px 1.5em; padding: 0px;&quot;&gt;In this example, we define a trait called&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;Runner&lt;/code&gt;&amp;nbsp;that has a single method called&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;run&lt;/code&gt;. We then define a class called&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;Athlete&lt;/code&gt;&amp;nbsp;that extends both the&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;Runner&lt;/code&gt;&amp;nbsp;and&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;Speaker&lt;/code&gt;&amp;nbsp;traits. This allows us to mix in multiple traits into a single class.&lt;/p&gt;&lt;h2 class=&quot;wp-block-heading&quot; style=&quot;-webkit-text-size-adjust: 100%; border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 30px; font-weight: 400; line-height: 1.2em; margin: 0px 0px 20px; padding: 0px; text-transform: uppercase;&quot;&gt;MIXINS&lt;/h2&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 17px; margin: 0px 0px 1.5em; padding: 0px;&quot;&gt;A mixin is a way of combining multiple traits together to form a new class. Mixins can be used to add functionality to a class without having to create a new inheritance hierarchy. Here’s an example:&lt;/p&gt;&lt;pre class=&quot;wp-block-preformatted&quot; style=&quot;-webkit-text-size-adjust: 100%; background: rgba(0, 0, 0, 0.05); border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: inherit; font-size: 17px; line-height: normal; margin-bottom: 1.5em; margin-top: 0px; max-width: 100%; overflow: auto; padding: 20px; white-space: pre-wrap;&quot;&gt;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;trait Swimmer {
  def swim(distance: Double): Unit
}

trait Cyclist {
  def cycle(distance: Double): Unit
}

class Triathlete(val name: String) extends Swimmer with Cyclist with Speaker {
  def swim(distance: Double): Unit = {
    speak(s&quot;$name is swimming $distance meters&quot;)
  }

  def cycle(distance: Double): Unit = {
    speak(s&quot;$name is cycling $distance kilometers&quot;)
  }
}

val triathlete = new Triathlete(&quot;Jane&quot;)
triathlete.swim(100.0) // prints &quot;Jane is swimming 100.0 meters&quot;
triathlete.cycle(10.0) // prints &quot;Jane is cycling 10.0 kilometers&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 17px; margin: 0px 0px 1.5em; padding: 0px;&quot;&gt;In this example, we define two traits called&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;Swimmer&lt;/code&gt;&amp;nbsp;and&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;Cyclist&lt;/code&gt;. We then define a class called&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;Triathlete&lt;/code&gt;&amp;nbsp;that mixes in these traits along with the&amp;nbsp;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;Speaker&lt;/code&gt;&amp;nbsp;trait. This allows us to create a new class with the combined functionality of all three traits.&lt;/p&gt;&lt;h3 class=&quot;wp-block-heading&quot; style=&quot;-webkit-text-size-adjust: 100%; border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 30px; font-weight: 500; line-height: 1.2em; margin: 0px 0px 20px; padding: 0px; text-transform: capitalize;&quot;&gt;Inheritance&lt;/h3&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 17px; margin: 0px 0px 1.5em; padding: 0px;&quot;&gt;Inheritance is a way of creating a new class that is a modified version of an existing class. In Scala, a class can only inherit from a single class, but it can mix in multiple traits. Here’s an example:&lt;/p&gt;&lt;pre class=&quot;wp-block-preformatted&quot; style=&quot;-webkit-text-size-adjust: 100%; background: rgba(0, 0, 0, 0.05); border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: inherit; font-size: 17px; line-height: normal; margin-bottom: 1.5em; margin-top: 0px; max-width: 100%; overflow: auto; padding: 20px; white-space: pre-wrap;&quot;&gt;&lt;code style=&quot;box-sizing: inherit; font-family: Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 15px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal;&quot;&gt;class Animal(val name: String) {
  def speak(): Unit = {
    println(&quot;...&quot;)
  }
}

class Cat(name: String) extends Animal(name) {
  override def speak(): Unit = {&lt;/code&gt;&lt;/pre&gt;&lt;h2 class=&quot;wp-block-heading&quot; style=&quot;-webkit-text-size-adjust: 100%; border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 30px; font-weight: 400; line-height: 1.2em; margin: 0px 0px 20px; padding: 0px; text-transform: uppercase;&quot;&gt;CONCLUSION&lt;/h2&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; border: 0px; box-sizing: inherit; caret-color: rgb(34, 34, 34); color: #222222; font-family: Rubik, sans-serif; font-size: 17px; margin: 0px 0px 1.5em; padding: 0px;&quot;&gt;Scala’s support for OOP features like classes, objects, inheritance, traits, and mixins makes it a powerful language for building complex, object-oriented applications. By understanding these features, you can write more modular, reusable, and extensible code.&lt;/p&gt;</description><link>http://spaceanalytics.blogspot.com/2023/07/poo-en-scala-traits-mixins-y-herencia.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-1807972334951627294</guid><pubDate>Sat, 29 Jul 2023 18:22:00 +0000</pubDate><atom:updated>2023-07-29T20:22:56.369+02:00</atom:updated><title>Crear bucle for/yield en Scala</title><description>&lt;p&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; color: #5f5f5f; font-family: Palatino, Georgia, Times; font-size: 18px;&quot;&gt;This is an excerpt from the&lt;/span&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; color: #5f5f5f; font-family: Palatino, Georgia, Times; font-size: 18px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://amzn.to/2c0XcgG&quot; style=&quot;-webkit-text-size-adjust: 100%; color: #3863ac; font-family: Palatino, Georgia, Times; font-size: 18px; text-decoration: none;&quot;&gt;Scala Cookbook&lt;span style=&quot;font-size: 12px; line-height: 0; position: relative; top: -0.5em; vertical-align: baseline;&quot;&gt;&amp;nbsp;(#ad)&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; color: #5f5f5f; font-family: Palatino, Georgia, Times; font-size: 18px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; color: #5f5f5f; font-family: Palatino, Georgia, Times; font-size: 18px;&quot;&gt;(partially modified for the internet). This is Recipe 3.4, “How to create a ‘for comprehension’ (for/yield loop).”&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;-webkit-text-size-adjust: 100%; color: #4d3a2a; font-family: &amp;quot;Lucida Grande&amp;quot;, Arial, Verdana, sans-serif; font-size: 20px; line-height: 1.2em; margin: 0px; opacity: 0.76; padding: 1.4em 0px 0px;&quot;&gt;Problem&lt;/h2&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; color: #5f5f5f; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em;&quot;&gt;You want to create a new&amp;nbsp;&lt;a href=&quot;http://scala-lang.org/&quot; style=&quot;color: #3863ac; text-decoration: none;&quot;&gt;Scala&lt;/a&gt;&amp;nbsp;collection from an existing collection by applying an algorithm (and potentially one or more guards) to each element in the original collection.&lt;/p&gt;&lt;h2 style=&quot;-webkit-text-size-adjust: 100%; color: #4d3a2a; font-family: &amp;quot;Lucida Grande&amp;quot;, Arial, Verdana, sans-serif; font-size: 20px; line-height: 1.2em; margin: 0px; opacity: 0.76; padding: 1.4em 0px 0px;&quot;&gt;Solution&lt;/h2&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; color: #5f5f5f; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em;&quot;&gt;Use a&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;yield&lt;/code&gt;&amp;nbsp;statement with a&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;for&lt;/code&gt;&amp;nbsp;loop and your algorithm to create a new collection from an existing collection.&lt;/p&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; color: #5f5f5f; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em;&quot;&gt;For instance, given an array of lowercase strings:&lt;/p&gt;&lt;pre style=&quot;-webkit-text-size-adjust: 100%; background-color: #fefefc; border-radius: 5px; border: 1px solid rgb(226, 226, 218); color: #585858; font-family: Menlo, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 1.5em; margin-bottom: 1.5em; overflow: auto; padding: 1.8em 6px 1.8em 16px;&quot;&gt;scala&amp;gt; &lt;strong&gt;val names = Array(&quot;chris&quot;, &quot;ed&quot;, &quot;maurice&quot;)&lt;/strong&gt;
names: Array[String] = Array(chris, ed, maurice)&lt;/pre&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; color: #5f5f5f; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em;&quot;&gt;you can create a new array of capitalized strings by combining&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;yield&lt;/code&gt;&amp;nbsp;with a&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;for&lt;/code&gt;&amp;nbsp;loop and a simple algorithm:&lt;/p&gt;&lt;pre style=&quot;-webkit-text-size-adjust: 100%; background-color: #fefefc; border-radius: 5px; border: 1px solid rgb(226, 226, 218); color: #585858; font-family: Menlo, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 1.5em; margin-bottom: 1.5em; overflow: auto; padding: 1.8em 6px 1.8em 16px;&quot;&gt;scala&amp;gt; &lt;strong&gt;val capNames = for (e &amp;lt;- names) yield e.capitalize&lt;/strong&gt;
capNames: Array[String] = Array(Chris, Ed, Maurice)&lt;/pre&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; color: #5f5f5f; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em;&quot;&gt;Using a&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;for&lt;/code&gt;&amp;nbsp;loop with a&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;yield&lt;/code&gt;&amp;nbsp;statement is known as a&amp;nbsp;&lt;em&gt;for-comprehension&lt;/em&gt;. If your algorithm requires multiple lines of code, perform the work in a block after the&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;yield&lt;/code&gt;&amp;nbsp;keyword:&lt;/p&gt;&lt;pre style=&quot;-webkit-text-size-adjust: 100%; background-color: #fefefc; border-radius: 5px; border: 1px solid rgb(226, 226, 218); color: #585858; font-family: Menlo, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 1.5em; margin-bottom: 1.5em; overflow: auto; padding: 1.8em 6px 1.8em 16px;&quot;&gt;scala&amp;gt; &lt;strong&gt;val lengths = for (e &amp;lt;- names) yield {&lt;/strong&gt;
     | &lt;strong&gt;    // imagine that this required multiple lines of code&lt;/strong&gt;
     | &lt;strong&gt;    e.length&lt;/strong&gt;
     | &lt;strong&gt;}&lt;/strong&gt;
lengths: Array[Int] = Array(5, 2, 7)&lt;/pre&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; color: #5f5f5f; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em;&quot;&gt;Except for rare occasions, the collection type returned by a for comprehension is the same type that you begin with. For instance, if the collection you’re looping over is an&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;ArrayBuffer&lt;/code&gt;:&lt;/p&gt;&lt;pre style=&quot;-webkit-text-size-adjust: 100%; background-color: #fefefc; border-radius: 5px; border: 1px solid rgb(226, 226, 218); color: #585858; font-family: Menlo, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 1.5em; margin-bottom: 1.5em; overflow: auto; padding: 1.8em 6px 1.8em 16px;&quot;&gt;var fruits = scala.collection.mutable.ArrayBuffer[String]()
fruits += &quot;apple&quot;
fruits += &quot;banana&quot;
fruits += &quot;orange&quot;&lt;/pre&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; color: #5f5f5f; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em;&quot;&gt;the collection your loop returns will also be an&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;ArrayBuffer&lt;/code&gt;:&lt;/p&gt;&lt;pre style=&quot;-webkit-text-size-adjust: 100%; background-color: #fefefc; border-radius: 5px; border: 1px solid rgb(226, 226, 218); color: #585858; font-family: Menlo, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 1.5em; margin-bottom: 1.5em; overflow: auto; padding: 1.8em 6px 1.8em 16px;&quot;&gt;scala&amp;gt; &lt;strong&gt;val out = for (e &amp;lt;- fruits) yield e.toUpperCase&lt;/strong&gt;
out: scala.collection.mutable.ArrayBuffer[java.lang.String] = ArrayBuffer(APPLE, BANANA, ORANGE)&lt;/pre&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; color: #5f5f5f; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em;&quot;&gt;If your input collection is a&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;List&lt;/code&gt;, the for/yield loop will return a List:&lt;/p&gt;&lt;pre style=&quot;-webkit-text-size-adjust: 100%; background-color: #fefefc; border-radius: 5px; border: 1px solid rgb(226, 226, 218); color: #585858; font-family: Menlo, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 1.5em; margin-bottom: 1.5em; overflow: auto; padding: 1.8em 6px 1.8em 16px;&quot;&gt;scala&amp;gt; &lt;strong&gt;val fruits = &quot;apple&quot; :: &quot;banana&quot; :: &quot;orange&quot; :: Nil&lt;/strong&gt;
fruits: List[java.lang.String] = List(apple, banana, orange)

scala&amp;gt; &lt;strong&gt;val out = for (e &amp;lt;- fruits) yield e.toUpperCase&lt;/strong&gt;
out: List[java.lang.String] = List(APPLE, BANANA, ORANGE)&lt;/pre&gt;&lt;h2 style=&quot;-webkit-text-size-adjust: 100%; color: #4d3a2a; font-family: &amp;quot;Lucida Grande&amp;quot;, Arial, Verdana, sans-serif; font-size: 20px; line-height: 1.2em; margin: 0px; opacity: 0.76; padding: 1.4em 0px 0px;&quot;&gt;Discussion&lt;/h2&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; color: #5f5f5f; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em;&quot;&gt;If you’re new to using&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;yield&lt;/code&gt;&amp;nbsp;with a&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;for&lt;/code&gt;&amp;nbsp;loop, it can help to think of the loop like this:&lt;/p&gt;&lt;ul style=&quot;-webkit-text-size-adjust: 100%; font-family: &amp;quot;Lucida Grande&amp;quot;, Arial, Verdana, sans-serif; margin: 1.5em 0px 1.5em 1.2em; padding-bottom: 0.1em; width: 516px;&quot;&gt;&lt;li style=&quot;color: #5f5f60; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em; list-style-type: circle; margin-bottom: 0.5em; margin-left: 0px; margin-right: 2em; padding-left: 0.2em;&quot;&gt;When it begins running, the for/yield loop immediately creates a new, empty collection that is of the same type as the input collection. For example, if the input type is a&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;Vector&lt;/code&gt;, the output type will also be a&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;Vector&lt;/code&gt;. You can think of this new collection as being like a bucket.&lt;/li&gt;&lt;li style=&quot;color: #5f5f60; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em; list-style-type: circle; margin-bottom: 0.5em; margin-left: 0px; margin-right: 2em; padding-left: 0.2em;&quot;&gt;On each iteration of the&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;for&lt;/code&gt;&amp;nbsp;loop, a new output element is created from the current element of the input collection. When the output element is created, it’s placed in the bucket.&lt;/li&gt;&lt;li style=&quot;color: #5f5f60; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em; list-style-type: circle; margin-bottom: 0.5em; margin-left: 0px; margin-right: 2em; padding-left: 0.2em;&quot;&gt;When the loop finishes running, the entire contents of the bucket are returned.&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; color: #5f5f5f; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em;&quot;&gt;That’s a simplification of the process, but I find it helpful when explaining the process. Writing a basic for/yield expression without a guard is just like calling the&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;map&lt;/code&gt;&amp;nbsp;method on a collection. For instance, the following for comprehension converts all the strings in the fruits collection to uppercase:&lt;/p&gt;&lt;pre style=&quot;-webkit-text-size-adjust: 100%; background-color: #fefefc; border-radius: 5px; border: 1px solid rgb(226, 226, 218); color: #585858; font-family: Menlo, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 1.5em; margin-bottom: 1.5em; overflow: auto; padding: 1.8em 6px 1.8em 16px;&quot;&gt;scala&amp;gt; &lt;strong&gt;val out = for (e &amp;lt;- fruits) yield e.toUpperCase&lt;/strong&gt;
out: List[String] = List(APPLE, BANANA, ORANGE)&lt;/pre&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; color: #5f5f5f; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em;&quot;&gt;Calling the&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;map&lt;/code&gt;&amp;nbsp;method on the collection does the same thing:&lt;/p&gt;&lt;pre style=&quot;-webkit-text-size-adjust: 100%; background-color: #fefefc; border-radius: 5px; border: 1px solid rgb(226, 226, 218); color: #585858; font-family: Menlo, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 1.5em; margin-bottom: 1.5em; overflow: auto; padding: 1.8em 6px 1.8em 16px;&quot;&gt;scala&amp;gt; &lt;strong&gt;val out = fruits.map(_.toUpperCase)&lt;/strong&gt;
out: List[String] = List(APPLE, BANANA, ORANGE)&lt;/pre&gt;&lt;p style=&quot;-webkit-text-size-adjust: 100%; color: #5f5f5f; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em;&quot;&gt;When I first started learning Scala, I wrote all of my code using for/yield expressions until the&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;map&lt;/code&gt;&amp;nbsp;light bulb went on one day.&lt;/p&gt;&lt;h2 style=&quot;-webkit-text-size-adjust: 100%; color: #4d3a2a; font-family: &amp;quot;Lucida Grande&amp;quot;, Arial, Verdana, sans-serif; font-size: 20px; line-height: 1.2em; margin: 0px; opacity: 0.76; padding: 1.4em 0px 0px;&quot;&gt;See Also&lt;/h2&gt;&lt;ul style=&quot;-webkit-text-size-adjust: 100%; font-family: &amp;quot;Lucida Grande&amp;quot;, Arial, Verdana, sans-serif; margin: 1.5em 0px 1.5em 1.2em; padding-bottom: 0.1em; width: 516px;&quot;&gt;&lt;li style=&quot;color: #5f5f60; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em; list-style-type: circle; margin-bottom: 0.5em; margin-left: 0px; margin-right: 2em; padding-left: 0.2em;&quot;&gt;Comparisons between for-comprehensions and&amp;nbsp;&lt;code style=&quot;font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 15px;&quot;&gt;map&lt;/code&gt;&amp;nbsp;are shown in more detail in Recipe 10.13, “&lt;a href=&quot;https://alvinalexander.com/scala/how-to-transform-collections-for-yield-loop-scala-cookbook&quot; style=&quot;color: #3863ac; text-decoration: none;&quot;&gt;How to transform one Scala collection to another with for/yield&lt;/a&gt;” and Recipe 10.14, “&lt;a href=&quot;https://alvinalexander.com/scala/how-to-transform-collections-map-method-anonymous-functions-scala&quot; style=&quot;color: #3863ac; text-decoration: none;&quot;&gt;How to transform one Scala collection to another with map&lt;/a&gt;”.&lt;/li&gt;&lt;li style=&quot;color: #5f5f60; font-family: Palatino, Georgia, Times; font-size: 18px; line-height: 1.4em; list-style-type: circle; margin-bottom: 0.5em; margin-left: 0px; margin-right: 2em; padding-left: 0.2em;&quot;&gt;The official Scala website offers an introduction to sequence comprehensions&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;color: #5f5f60; font-family: Palatino, Georgia, Times; font-size: medium;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; caret-color: rgb(95, 95, 96);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;

</description><link>http://spaceanalytics.blogspot.com/2023/07/crear-bucle-foryield-en-scala.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-5827947764509445046</guid><pubDate>Sat, 29 Jul 2023 18:04:00 +0000</pubDate><atom:updated>2023-07-29T20:04:59.469+02:00</atom:updated><title>Pattern matching en Scala</title><description>&lt;p&gt;&amp;nbsp;&lt;strong class=&quot;le ew&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot;&gt;Pattern matching&lt;/strong&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot;&gt;, es un mecanismo usado en programación funcional que permite evaluar un objeto/valor/expresión contra una serie de valores/objetos/expresiones, es como un&lt;/span&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;cw ma mb mc md b&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f2f2f2; box-sizing: inherit; color: #242424; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 15px; letter-spacing: -0.003em; padding: 2px 4px;&quot;&gt;switch&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot;&gt;con esteroides ya que un&lt;/span&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;cw ma mb mc md b&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f2f2f2; box-sizing: inherit; color: #242424; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 15px; letter-spacing: -0.003em; padding: 2px 4px;&quot;&gt;switch&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot;&gt;sólo soporta algunos tipos en la evaluación (cadenas y enteros) por lo que resulta ser una versión más poderosa que el&lt;/span&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;cw ma mb mc md b&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f2f2f2; box-sizing: inherit; color: #242424; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 15px; letter-spacing: -0.003em; padding: 2px 4px;&quot;&gt;switch&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot;&gt;de Java o incluso que usar una serie de sentencias&lt;/span&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;cw ma mb mc md b&quot; style=&quot;-webkit-text-size-adjust: 100%; background-color: #f2f2f2; box-sizing: inherit; color: #242424; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 15px; letter-spacing: -0.003em; padding: 2px 4px;&quot;&gt;if-else&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em;&quot;&gt;, porque la coincidencia exitosa del valor contra el patrón definido puede deconstruir el valor en sus partes constituyentes.&lt;/span&gt;&lt;/p&gt;&lt;figure class=&quot;mh mi mj mk ml mm me mf paragraph-image&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; caret-color: rgba(0, 0, 0, 0.8); clear: both; color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; margin: 56px auto 0px;&quot;&gt;&lt;div class=&quot;me mf mg&quot; style=&quot;box-sizing: inherit; margin-left: auto; margin-right: auto; max-width: 638px;&quot;&gt;&lt;picture style=&quot;box-sizing: inherit;&quot;&gt;&lt;source sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 638px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/format:webp/1*WY8rFIDJAURxIf_usJDF8w.jpeg 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*WY8rFIDJAURxIf_usJDF8w.jpeg 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*WY8rFIDJAURxIf_usJDF8w.jpeg 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*WY8rFIDJAURxIf_usJDF8w.jpeg 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*WY8rFIDJAURxIf_usJDF8w.jpeg 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*WY8rFIDJAURxIf_usJDF8w.jpeg 1100w, https://miro.medium.com/v2/resize:fit:1276/format:webp/1*WY8rFIDJAURxIf_usJDF8w.jpeg 1276w&quot; style=&quot;box-sizing: inherit;&quot; type=&quot;image/webp&quot;&gt;&lt;/source&gt;&lt;source data-testid=&quot;og&quot; sizes=&quot;(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 638px&quot; srcset=&quot;https://miro.medium.com/v2/resize:fit:640/1*WY8rFIDJAURxIf_usJDF8w.jpeg 640w, https://miro.medium.com/v2/resize:fit:720/1*WY8rFIDJAURxIf_usJDF8w.jpeg 720w, https://miro.medium.com/v2/resize:fit:750/1*WY8rFIDJAURxIf_usJDF8w.jpeg 750w, https://miro.medium.com/v2/resize:fit:786/1*WY8rFIDJAURxIf_usJDF8w.jpeg 786w, https://miro.medium.com/v2/resize:fit:828/1*WY8rFIDJAURxIf_usJDF8w.jpeg 828w, https://miro.medium.com/v2/resize:fit:1100/1*WY8rFIDJAURxIf_usJDF8w.jpeg 1100w, https://miro.medium.com/v2/resize:fit:1276/1*WY8rFIDJAURxIf_usJDF8w.jpeg 1276w&quot; style=&quot;box-sizing: inherit;&quot;&gt;&lt;/source&gt;&lt;img alt=&quot;&quot; class=&quot;bg mn mo c&quot; height=&quot;359&quot; loading=&quot;eager&quot; role=&quot;presentation&quot; src=&quot;https://miro.medium.com/v2/resize:fit:1276/1*WY8rFIDJAURxIf_usJDF8w.jpeg&quot; style=&quot;background-color: white; box-sizing: inherit; height: auto; max-width: 100%; vertical-align: middle; width: 638px;&quot; width=&quot;638&quot; /&gt;&lt;/picture&gt;&lt;/div&gt;&lt;figcaption class=&quot;mp mq mr me mf ms mt be b bf z hb&quot; data-selectable-paragraph=&quot;&quot; style=&quot;box-sizing: inherit; color: #6b6b6b; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px; margin-left: auto; margin-right: auto; margin-top: 10px; max-width: 728px; text-align: center;&quot;&gt;&lt;a class=&quot;af mu&quot; href=&quot;https://image.slidesharecdn.com/beautyofpatternmatching-130215053958-phpapp02/95/beauty-of-pattern-matching-3-638.jpg?cb=1360906974&quot; rel=&quot;noopener ugc nofollow&quot; style=&quot;-webkit-tap-highlight-color: transparent; box-sizing: inherit;&quot; target=&quot;_blank&quot;&gt;Scala match vs Java switch&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p class=&quot;pw-post-body-paragraph lc ld ev le b lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz eo bj&quot; data-selectable-paragraph=&quot;&quot; id=&quot;539a&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2em 0px -0.46em; word-break: break-word;&quot;&gt;El&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;pattern matching&lt;/em&gt;&amp;nbsp;permite deconstruir un objeto y evaluarlo.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph lc ld ev le b lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz eo bj&quot; data-selectable-paragraph=&quot;&quot; id=&quot;cba1&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2em 0px -0.46em; word-break: break-word;&quot;&gt;Veamos un ejemplo:&lt;/p&gt;&lt;pre class=&quot;mh mi mj mk ml mw md mx my ax mz bj&quot; style=&quot;-webkit-text-size-adjust: 100%; background: rgb(242, 242, 242); border-radius: 0px; border: medium; box-sizing: inherit; color: #242424; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; margin-bottom: 0px; margin-top: 56px; overflow-x: auto; padding: 20px;&quot;&gt;&lt;span class=&quot;na nb ev md b gw nc nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;93d1&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: -0.09em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;&lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;import&lt;/strong&gt; scala.util.&lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Random&lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;na nb ev md b gw nf nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;a0d6&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: 0.91em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;&lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;val&lt;/strong&gt; x: &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Int&lt;/strong&gt; = &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Random&lt;/strong&gt;.nextInt(10)&lt;/span&gt;&lt;span class=&quot;na nb ev md b gw nf nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;8d33&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: 0.91em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;x &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;match&lt;/strong&gt; {&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; 0 =&amp;gt; &quot;zero&quot;&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; 1 =&amp;gt; &quot;one&quot;&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; 2 =&amp;gt; &quot;two&quot;&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; _ =&amp;gt; &quot;many&quot;&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;p class=&quot;pw-post-body-paragraph lc ld ev le b lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz eo bj&quot; data-selectable-paragraph=&quot;&quot; id=&quot;2735&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2em 0px -0.46em; word-break: break-word;&quot;&gt;En éste ejemplo podemos observar el uso del&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;pattern matching&lt;/em&gt;&amp;nbsp;en un&amp;nbsp;&lt;strong class=&quot;le ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;valor&lt;/strong&gt;para deconstruir ese valor y “reaccionar” a él. La sintaxis es&amp;nbsp;&lt;code class=&quot;cw ma mb mc md b&quot; style=&quot;background-color: #f2f2f2; box-sizing: inherit; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 15px; padding: 2px 4px;&quot;&gt;selector&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;&amp;nbsp;&lt;/em&gt;&lt;strong class=&quot;le ew&quot; style=&quot;box-sizing: inherit; font-family: inherit;&quot;&gt;match&lt;/strong&gt;&amp;nbsp;{ case clauses }&lt;/code&gt;&amp;nbsp;donde&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;selector&lt;/em&gt;&amp;nbsp;es el valor y las&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;case clauses&lt;/em&gt;&amp;nbsp;son las alternativas que queremos comparar para hacer&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;match&lt;/em&gt;. Es posible definir una expresión&amp;nbsp;&lt;code class=&quot;cw ma mb mc md b&quot; style=&quot;background-color: #f2f2f2; box-sizing: inherit; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 15px; padding: 2px 4px;&quot;&gt;match&lt;/code&gt;&amp;nbsp;y definir un valor de retorno de la siguiente forma:&lt;/p&gt;&lt;pre class=&quot;mh mi mj mk ml mw md mx my ax mz bj&quot; style=&quot;-webkit-text-size-adjust: 100%; background: rgb(242, 242, 242); border-radius: 0px; border: medium; box-sizing: inherit; color: #242424; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; margin-bottom: 0px; margin-top: 56px; overflow-x: auto; padding: 20px;&quot;&gt;&lt;span class=&quot;na nb ev md b gw nc nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;64de&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: -0.09em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;&lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;def&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;matchTest&lt;/strong&gt;(x: &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Int&lt;/strong&gt;): &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;String&lt;/strong&gt; = x &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;match&lt;/strong&gt; {   &lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; 1 =&amp;gt; &quot;one&quot;   &lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; 2 =&amp;gt; &quot;two&quot;   &lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; _ =&amp;gt; &quot;many&quot; &lt;br style=&quot;box-sizing: inherit;&quot; /&gt;}&lt;/span&gt;&lt;span class=&quot;na nb ev md b gw nf nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;10a4&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: 0.91em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;matchTest(3)  &lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;// many&lt;/em&gt; &lt;br style=&quot;box-sizing: inherit;&quot; /&gt;matchTest(1)  &lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;// one&lt;/em&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p class=&quot;pw-post-body-paragraph lc ld ev le b lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz eo bj&quot; data-selectable-paragraph=&quot;&quot; id=&quot;d49f&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2em 0px -0.46em; word-break: break-word;&quot;&gt;De esta forma podemos reutilizar la expresión y usar su valor de retorno en otra expresión.&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;Pattern matching&lt;/em&gt;&amp;nbsp;se puede utilizar en distintos tipos de patrones (&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;case clauses)&lt;/em&gt;&amp;nbsp;como: constantes, variables, secuencias, tuplas, tipos,&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;case classes&lt;/em&gt;, etc. Veamos algunos ejemplos de esto:&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph lc ld ev le b lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz eo bj&quot; data-selectable-paragraph=&quot;&quot; id=&quot;f2a1&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2em 0px -0.46em; word-break: break-word;&quot;&gt;&lt;strong class=&quot;le ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Sequences (Lists o Arrays)&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;mh mi mj mk ml mw md mx my ax mz bj&quot; style=&quot;-webkit-text-size-adjust: 100%; background: rgb(242, 242, 242); border-radius: 0px; border: medium; box-sizing: inherit; color: #242424; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; margin-bottom: 0px; margin-top: 56px; overflow-x: auto; padding: 20px;&quot;&gt;&lt;span class=&quot;na nb ev md b gw nc nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;d487&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: -0.09em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;expr &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;match&lt;/strong&gt; { &lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case List(0, _, _)&lt;/strong&gt; =&amp;gt; println(&quot;found it&quot;)&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case _&lt;/strong&gt; =&amp;gt;&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;}&lt;/span&gt;&lt;span class=&quot;na nb ev md b gw nf nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;579a&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: 0.91em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;expr &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;match&lt;/strong&gt; { // use _* to avoid specifying how long it can be&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;    &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case List(0, _*)&lt;/strong&gt; =&amp;gt; println(&quot;found it&quot;)&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;    &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case _&lt;/strong&gt; =&amp;gt;&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;p class=&quot;pw-post-body-paragraph lc ld ev le b lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz eo bj&quot; data-selectable-paragraph=&quot;&quot; id=&quot;f919&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2em 0px -0.46em; word-break: break-word;&quot;&gt;&lt;strong class=&quot;le ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Tuples&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;mh mi mj mk ml mw md mx my ax mz bj&quot; style=&quot;-webkit-text-size-adjust: 100%; background: rgb(242, 242, 242); border-radius: 0px; border: medium; box-sizing: inherit; color: #242424; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; margin-bottom: 0px; margin-top: 56px; overflow-x: auto; padding: 20px;&quot;&gt;&lt;span class=&quot;na nb ev md b gw nc nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;d35f&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: -0.09em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;&lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;def&lt;/strong&gt; tupleDemo(expr: &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Any&lt;/strong&gt;) = expr &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;match&lt;/strong&gt; {&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case (a, b, c)&lt;/strong&gt;  =&amp;gt;  println(&quot;matched &quot;+ a + b + c)&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case _&lt;/strong&gt; =&amp;gt; &lt;br style=&quot;box-sizing: inherit;&quot; /&gt;}&lt;/span&gt;&lt;span class=&quot;na nb ev md b gw nf nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;a5d5&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: 0.91em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;tupleDemo((&quot;a &quot;, 3, &quot;-tuple&quot;)) // prints matched a 3-tuple&lt;/span&gt;&lt;/pre&gt;&lt;p class=&quot;pw-post-body-paragraph lc ld ev le b lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz eo bj&quot; data-selectable-paragraph=&quot;&quot; id=&quot;44b2&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2em 0px -0.46em; word-break: break-word;&quot;&gt;&lt;strong class=&quot;le ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Types&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;mh mi mj mk ml mw md mx my ax mz bj&quot; style=&quot;-webkit-text-size-adjust: 100%; background: rgb(242, 242, 242); border-radius: 0px; border: medium; box-sizing: inherit; color: #242424; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; margin-bottom: 0px; margin-top: 56px; overflow-x: auto; padding: 20px;&quot;&gt;&lt;span class=&quot;na nb ev md b gw nc nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;3368&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: -0.09em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;&lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;def&lt;/strong&gt; generalSize(x: &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Any&lt;/strong&gt;) = x &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;match&lt;/strong&gt; {&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;    &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; s: &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;String&lt;/strong&gt; =&amp;gt; s.length&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;    &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; m: &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Map[_, _]&lt;/strong&gt; =&amp;gt; m.size&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;    &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; _ =&amp;gt; -1&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;}&lt;/span&gt;&lt;span class=&quot;na nb ev md b gw nf nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;ae4b&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: 0.91em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;generalSize(&quot;abc) // returns Int = 3&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;generalSize(&lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Map&lt;/strong&gt;(1 -&amp;gt; &#39;a&#39;, 2 -&amp;gt; &#39;b&#39;)) // returns Int = 2&lt;/span&gt;&lt;/pre&gt;&lt;p class=&quot;pw-post-body-paragraph lc ld ev le b lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz eo bj&quot; data-selectable-paragraph=&quot;&quot; id=&quot;8031&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2em 0px -0.46em; word-break: break-word;&quot;&gt;En los ejemplos anteriores se describe la simplicidad con la que podemos hacer uso de esta herramienta para diferentes&amp;nbsp;&lt;strong class=&quot;le ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;tipos&lt;/strong&gt;, la variedad de patrones que podemos encontrar puede enriquecer y simplificar lo que deseamos expresar en nuestro código, como el caso de los “&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;types&lt;/em&gt;”, donde hacemos&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;match&lt;/em&gt;&amp;nbsp;por el&amp;nbsp;&lt;strong class=&quot;le ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;tipo&lt;/strong&gt;&amp;nbsp;de dato para crear una expresión generalizada de tamaños de datos.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph lc ld ev le b lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz eo bj&quot; data-selectable-paragraph=&quot;&quot; id=&quot;912f&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2em 0px -0.46em; word-break: break-word;&quot;&gt;Ahora veamos un ejemplo con&amp;nbsp;&lt;strong class=&quot;le ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;case clases&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;pre class=&quot;mh mi mj mk ml mw md mx my ax mz bj&quot; style=&quot;-webkit-text-size-adjust: 100%; background: rgb(242, 242, 242); border-radius: 0px; border: medium; box-sizing: inherit; color: #242424; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; margin-bottom: 0px; margin-top: 56px; overflow-x: auto; padding: 20px;&quot;&gt;&lt;span class=&quot;na nb ev md b gw nc nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;07a3&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: -0.09em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;&lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;abstract&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;class&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Notification&lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;na nb ev md b gw nf nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;da6c&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: 0.91em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;&lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;class&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Email&lt;/strong&gt;(sender: &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;String&lt;/strong&gt;, title: &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;String&lt;/strong&gt;, body: &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;String&lt;/strong&gt;) &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;extends&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Notification&lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;na nb ev md b gw nf nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;6499&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: 0.91em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;&lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;class&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;SMS&lt;/strong&gt;(caller: &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;String&lt;/strong&gt;, message: &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;String&lt;/strong&gt;) &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;extends&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Notification&lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;na nb ev md b gw nf nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;9445&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: 0.91em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;&lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;class&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;VoiceRecording&lt;/strong&gt;(contactName: &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;String&lt;/strong&gt;, link: &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;String&lt;/strong&gt;) &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;extends&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Notification&lt;/strong&gt;&lt;/span&gt;&lt;span class=&quot;na nb ev md b gw nf nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;9df7&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: 0.91em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;&lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;def&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;showNotification&lt;/strong&gt;(notification: &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Notification&lt;/strong&gt;): &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;String&lt;/strong&gt; = {&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  notification &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;match&lt;/strong&gt; {&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Email&lt;/strong&gt;(email, title, _) =&amp;gt;&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;      s&quot;You got an email from $email with title: $title&quot;&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;SMS&lt;/strong&gt;(number, message) =&amp;gt;&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;      s&quot;You got an SMS from $number! Message: $message&quot;&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;VoiceRecording&lt;/strong&gt;(name, link) =&amp;gt;&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;      s&quot;you received a Voice Recording from $name! Click the link to hear it: $link&quot;&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;case&lt;/strong&gt; &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;_&lt;/strong&gt; =&amp;gt; &quot;No notification&quot; &lt;br style=&quot;box-sizing: inherit;&quot; /&gt;  }&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;}&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;&lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;val&lt;/strong&gt; someSms = &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;SMS&lt;/strong&gt;(&quot;12345&quot;, &quot;Are you there?&quot;)&lt;br style=&quot;box-sizing: inherit;&quot; /&gt;&lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;val&lt;/strong&gt; someVoiceRecording = &lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;VoiceRecording&lt;/strong&gt;(&quot;Tom&quot;, &quot;voicerecording.org/id/123&quot;)&lt;/span&gt;&lt;span class=&quot;na nb ev md b gw nf nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;65c6&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: 0.91em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;println(&lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;showNotification&lt;/strong&gt;(someSms))  &lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;// prints You got an SMS from 12345! Message: Are you there?&lt;/em&gt;&lt;/span&gt;&lt;span class=&quot;na nb ev md b gw nf nd l hn ne&quot; data-selectable-paragraph=&quot;&quot; id=&quot;2ee0&quot; style=&quot;box-sizing: inherit; display: block; font-size: 16px; letter-spacing: -0.022em; line-height: 1.18; margin-bottom: -0.09em; margin-top: 0.91em; min-width: fit-content; white-space: pre-wrap;&quot;&gt;println(&lt;strong class=&quot;md ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;showNotification&lt;/strong&gt;(someVoiceRecording))  &lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;// you received a Voice Recording from Tom! Click the link to hear it: voicerecording.org/id/123&lt;/em&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p class=&quot;pw-post-body-paragraph lc ld ev le b lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz eo bj&quot; data-selectable-paragraph=&quot;&quot; id=&quot;b5c3&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2em 0px -0.46em; word-break: break-word;&quot;&gt;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;Pattern matching&lt;/em&gt;&amp;nbsp;en&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;case classes&lt;/em&gt;&amp;nbsp;es muy útil y dota de mucha expresión sobre lo que queremos hacer con poco código, además de que no sólo podemos hacer&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;case clauses&lt;/em&gt;&amp;nbsp;sobre el&amp;nbsp;&lt;strong class=&quot;le ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;tipo&lt;/strong&gt;&amp;nbsp;de valor sino sobre su estructura como es el caso de&amp;nbsp;&lt;code class=&quot;cw ma mb mc md b&quot; style=&quot;background-color: #f2f2f2; box-sizing: inherit; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 15px; padding: 2px 4px;&quot;&gt;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;case Email(...)&lt;/em&gt;&lt;/code&gt;&amp;nbsp;donde no nos importa el&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;body&lt;/em&gt;&amp;nbsp;del email sino sólamente hacer&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;match&lt;/em&gt;&amp;nbsp;con el email y el título, de esta forma podemos elegir sobre qué atributos hacer&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;match&lt;/em&gt;. Otra cosa a destacar es la forma tan simple en la que hemos creado un método o función para visualizar notificaciones, un problema muy común hoy en día, pues ¿en cuántas páginas en internet o aplicaciones en nuestro celular no hemos visto notificaciones aparecer?, todas de distintos tipos pero siempre visualizadas de la misma forma, sólo basta pensar en un modelo de datos tan simple como el que muestra el ejemplo y lo demás viene por añadidura en el lenguaje.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph lc ld ev le b lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz eo bj&quot; data-selectable-paragraph=&quot;&quot; id=&quot;e694&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2em 0px -0.46em; word-break: break-word;&quot;&gt;Y así como creamos&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;case clauses&lt;/em&gt;&amp;nbsp;para&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;case classes&lt;/em&gt;, podemos hacerlo para otros tipos siendo&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;pattern matching&lt;/em&gt;&amp;nbsp;una herramienta tan conveniente pues&amp;nbsp;&lt;strong class=&quot;le ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;todos&lt;/strong&gt;los tipos pueden figurar para hacer&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;match&lt;/em&gt;. Un ejemplo de esto puede ser el uso de&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;pattern matching&lt;/em&gt;&amp;nbsp;para manejar nuestras excepciones de una forma más funcional, en vez de sólo lanzar la excepción y terminar de forma inadecuada podemos crear&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;case clauses&lt;/em&gt;&amp;nbsp;que retornen un valor equivalente al error que estamos encontrando. Podemos “validar” el contenido de una variable, para saber si una función está recibiendo los parámetros adecuados o también el valor de retorno de una función por ejemplo en el caso de ser de tipo&amp;nbsp;&lt;code class=&quot;cw ma mb mc md b&quot; style=&quot;background-color: #f2f2f2; box-sizing: inherit; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 15px; padding: 2px 4px;&quot;&gt;Option&lt;/code&gt;&amp;nbsp;donde simplemente indicamos que puede contener “algo” lo cual sería un tipo&amp;nbsp;&lt;code class=&quot;cw ma mb mc md b&quot; style=&quot;background-color: #f2f2f2; box-sizing: inherit; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 15px; padding: 2px 4px;&quot;&gt;Some&lt;/code&gt;, o no contener “algo” que sería un&amp;nbsp;&lt;code class=&quot;cw ma mb mc md b&quot; style=&quot;background-color: #f2f2f2; box-sizing: inherit; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 15px; padding: 2px 4px;&quot;&gt;None&lt;/code&gt;, pero esto podemos verlo con más detalle en un siguiente post sobre Scala.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph lc ld ev le b lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz eo bj&quot; data-selectable-paragraph=&quot;&quot; id=&quot;91f2&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2em 0px -0.46em; word-break: break-word;&quot;&gt;Por último quiero explicar los&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;case clauses&lt;/em&gt;&amp;nbsp;de los ejemplos donde agregamos un&amp;nbsp;&lt;code class=&quot;cw ma mb mc md b&quot; style=&quot;background-color: #f2f2f2; box-sizing: inherit; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 15px; padding: 2px 4px;&quot;&gt;_&lt;/code&gt;&amp;nbsp;(guión bajo), esta notación llamada&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;wildcard&lt;/em&gt;&amp;nbsp;hace&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;match&lt;/em&gt;&amp;nbsp;con cualquier objeto en absoluto y puede servir de distintas formas según sea la necesidad, la principal puede ser simplemente que queremos descartar cualquier otro valor, todo lo que no haga&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;match&lt;/em&gt;&amp;nbsp;con los casos anteriores hará&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;match&lt;/em&gt;&amp;nbsp;con el&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;wildcard&lt;/em&gt;, en nuestro último ejemplo se utiliza para determinar si el valor enviado a la función&amp;nbsp;&lt;code class=&quot;cw ma mb mc md b&quot; style=&quot;background-color: #f2f2f2; box-sizing: inherit; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 15px; padding: 2px 4px;&quot;&gt;showNotification()&lt;/code&gt;&amp;nbsp;no es una notificación y al tener como valor de retorno un&amp;nbsp;&lt;code class=&quot;cw ma mb mc md b&quot; style=&quot;background-color: #f2f2f2; box-sizing: inherit; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 15px; padding: 2px 4px;&quot;&gt;String&lt;/code&gt;&amp;nbsp;simplemente retornamos un mensaje que dice que no es una notificación.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph lc ld ev le b lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz eo bj&quot; data-selectable-paragraph=&quot;&quot; id=&quot;ef16&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2em 0px -0.46em; word-break: break-word;&quot;&gt;¿Te diste cuenta de la notación en los&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;Strings&lt;/em&gt;&amp;nbsp;que creamos para cada caso?&amp;nbsp;&lt;code class=&quot;cw ma mb mc md b&quot; style=&quot;background-color: #f2f2f2; box-sizing: inherit; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 15px; padding: 2px 4px;&quot;&gt;s”Message $value some other $value2”&lt;/code&gt;, en Scala esta notación es conocida como&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;string interpolation&lt;/em&gt;&amp;nbsp;que simplemente nos permite embeber la referencia de una variable o valor dentro de las literales&amp;nbsp;&lt;code class=&quot;cw ma mb mc md b&quot; style=&quot;background-color: #f2f2f2; box-sizing: inherit; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 15px; padding: 2px 4px;&quot;&gt;String&lt;/code&gt;&amp;nbsp;(una forma elegante de crear&amp;nbsp;&lt;code class=&quot;cw ma mb mc md b&quot; style=&quot;background-color: #f2f2f2; box-sizing: inherit; font-family: source-code-pro, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: 15px; padding: 2px 4px;&quot;&gt;Strings&lt;/code&gt;), y esto es posible gracias a el&amp;nbsp;&lt;strong class=&quot;le ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;interpolator&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;&amp;nbsp;“s”&lt;/em&gt;&lt;/strong&gt;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;&amp;nbsp;&lt;/em&gt;que está antes de la literal; existen otros&amp;nbsp;&lt;strong class=&quot;le ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;interpolators&lt;/strong&gt;&amp;nbsp;y nosotros podríamos crear el nuestro :)&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph lc ld ev le b lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz eo bj&quot; data-selectable-paragraph=&quot;&quot; id=&quot;211d&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2em 0px -0.46em; word-break: break-word;&quot;&gt;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;Pattern matching&lt;/em&gt;,&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;Options&lt;/em&gt;,&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;wildcards&lt;/em&gt;,&amp;nbsp;&lt;em class=&quot;mv&quot; style=&quot;box-sizing: inherit;&quot;&gt;interpolators&lt;/em&gt;, son sólo algunas cosas más que hacen a Scala un lenguaje elegante, y más allá de elegante, simple en su forma de expresar código.&lt;/p&gt;&lt;p class=&quot;pw-post-body-paragraph lc ld ev le b lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz eo bj&quot; data-selectable-paragraph=&quot;&quot; id=&quot;c0ee&quot; style=&quot;-webkit-text-size-adjust: 100%; box-sizing: inherit; color: #242424; font-family: source-serif-pro, Georgia, Cambria, &amp;quot;Times New Roman&amp;quot;, Times, serif; font-size: 20px; letter-spacing: -0.003em; line-height: 32px; margin: 2em 0px -0.46em; word-break: break-word;&quot;&gt;&lt;strong class=&quot;le ew&quot; style=&quot;box-sizing: inherit;&quot;&gt;Referencias&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;ng nh ni nj nk nl&quot; style=&quot;-webkit-text-size-adjust: 100%; box-shadow: rgb(242, 242, 242) 0px 0px 0px 1px inset; box-sizing: inherit; caret-color: rgba(0, 0, 0, 0.8); color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; margin-top: 32px;&quot;&gt;&lt;a href=&quot;https://booksites.artima.com/programming_in_scala_3ed&quot; rel=&quot;noopener  ugc nofollow&quot; style=&quot;-webkit-tap-highlight-color: transparent; box-sizing: inherit; text-decoration: none;&quot; target=&quot;_blank&quot;&gt;&lt;div class=&quot;nm ab hh&quot; style=&quot;box-sizing: inherit; display: flex; flex: 0 0 auto; padding: 0px;&quot;&gt;&lt;div class=&quot;nn ab cn ca no np&quot; style=&quot;box-sizing: inherit; display: flex; flex-direction: column; flex: 1 1 auto; justify-content: center; padding: 16px 20px;&quot;&gt;&lt;h2 class=&quot;be ew gw z hp nq hr hs nr hu hw eu bj&quot; style=&quot;-webkit-box-orient: vertical; -webkit-line-clamp: 2; box-sizing: inherit; color: #242424; display: -webkit-box; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; letter-spacing: 0px; line-height: 20px; margin: 0px; max-height: 40px; overflow: hidden; text-overflow: ellipsis;&quot;&gt;Programming in Scala, Third Edition Resources&lt;/h2&gt;&lt;div class=&quot;ns l&quot; style=&quot;box-sizing: inherit; margin-top: 8px;&quot;&gt;&lt;h3 class=&quot;be b gw z hp nq hr hs nr hu hw hb&quot; style=&quot;-webkit-box-orient: vertical; -webkit-line-clamp: 2; box-sizing: inherit; color: #6b6b6b; display: -webkit-box; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; font-weight: 400; line-height: 20px; margin: 0px; max-height: 40px; overflow: hidden; text-overflow: ellipsis;&quot;&gt;(If you don&#39;t already have it, you can purchase Programming in Scala, Third Edition here.)&lt;/h3&gt;&lt;/div&gt;&lt;div class=&quot;nt l&quot; style=&quot;box-sizing: inherit; margin-top: 12px;&quot;&gt;&lt;p class=&quot;be b kc z hp nq hr hs nr hu hw hb&quot; style=&quot;-webkit-box-orient: vertical; -webkit-line-clamp: 2; box-sizing: inherit; color: #6b6b6b; display: -webkit-box; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 13px; line-height: 20px; margin: 0px; max-height: 40px; overflow: hidden; text-overflow: ellipsis;&quot;&gt;booksites.artima.com&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;nu l&quot; style=&quot;box-sizing: inherit; width: 160px;&quot;&gt;&lt;div class=&quot;nv l nw nx ny nu nz mn nl&quot; style=&quot;background-image: url(&amp;quot;https://miro.medium.com/v2/resize:fit:320/0*aJIwoLT7nepz8MRJ&amp;quot;); background-origin: border-box; background-position: 50% 50%; background-size: cover; box-shadow: rgb(242, 242, 242) 0px 0px 0px 1px inset; box-sizing: inherit; height: 167px; max-width: 100%; width: 160px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;ng nh ni nj nk nl&quot; style=&quot;-webkit-text-size-adjust: 100%; box-shadow: rgb(242, 242, 242) 0px 0px 0px 1px inset; box-sizing: inherit; caret-color: rgba(0, 0, 0, 0.8); color: rgba(0, 0, 0, 0.8); font-family: medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Open Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; margin-top: 32px;&quot;&gt;&lt;a href=&quot;https://docs.scala-lang.org/tour/pattern-matching.html&quot; rel=&quot;noopener  ugc nofollow&quot; style=&quot;-webkit-tap-highlight-color: transparent; box-sizing: inherit; text-decoration: none;&quot; target=&quot;_blank&quot;&gt;&lt;div class=&quot;nm ab hh&quot; style=&quot;box-sizing: inherit; display: flex; flex: 0 0 auto; padding: 0px;&quot;&gt;&lt;div class=&quot;nn ab cn ca no np&quot; style=&quot;box-sizing: inherit; display: flex; flex-direction: column; flex: 1 1 auto; justify-content: center; padding: 16px 20px;&quot;&gt;&lt;h2 class=&quot;be ew gw z hp nq hr hs nr hu hw eu bj&quot; style=&quot;-webkit-box-orient: vertical; -webkit-line-clamp: 2; box-sizing: inherit; color: #242424; display: -webkit-box; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; letter-spacing: 0px; line-height: 20px; margin: 0px; max-height: 40px; overflow: hidden; text-overflow: ellipsis;&quot;&gt;Pattern Matching | Scala Documentation&lt;/h2&gt;&lt;div class=&quot;ns l&quot; style=&quot;box-sizing: inherit; margin-top: 8px;&quot;&gt;&lt;h3 class=&quot;be b gw z hp nq hr hs nr hu hw hb&quot; style=&quot;-webkit-box-orient: vertical; -webkit-line-clamp: 2; box-sizing: inherit; color: #6b6b6b; display: -webkit-box; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; font-weight: 400; line-height: 20px; margin: 0px; max-height: 40px; overflow: hidden; text-overflow: ellipsis;&quot;&gt;Pattern matching is a mechanism for checking a value against a pattern. A successful match can also deconstruct a value…&lt;/h3&gt;&lt;/div&gt;&lt;div class=&quot;nt l&quot; style=&quot;box-sizing: inherit; margin-top: 12px;&quot;&gt;&lt;p class=&quot;be b kc z hp nq hr hs nr hu hw hb&quot; style=&quot;-webkit-box-orient: vertical; -webkit-line-clamp: 2; box-sizing: inherit; color: #6b6b6b; display: -webkit-box; font-family: sohne, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 13px; line-height: 20px; margin: 0px; max-height: 40px; overflow: hidden; text-overflow: ellipsis;&quot;&gt;docs.scala-lang.org&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;</description><link>http://spaceanalytics.blogspot.com/2023/07/pattern-matching-en-scala.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-6084922538612892909</guid><pubDate>Sat, 29 Jul 2023 16:21:00 +0000</pubDate><atom:updated>2023-07-29T18:26:34.167+02:00</atom:updated><title>Formatear código en IntelliJ</title><description>&lt;p&gt;&lt;span class=&quot;s1&quot; style=&quot;-webkit-text-size-adjust: auto; font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;SHIFT + ENTER&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;-webkit-text-size-adjust: auto; font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;= insertar nueva línea&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;TAB&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;= escribir palabra clave (por ejemplo, main) y pulsar para sacar live template&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;CTRL + E&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;= Ver ficheros recientes&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;CTRL + ALT + L&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;= Reformatear código (resaltado o todo el fichero)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;PREFERENCES&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;= Definir los estándares esperados en&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;Editor / Code Style&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;. Buscando&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;Align&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;en la pestaña de&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;Wrapping&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;y localizar&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;Chained Method Calls&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;para poder alineas las llamadas múltiples en diferentes líneas de manera que el punto esté alineado (&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;Align when multiline&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;). Con CTRL+ ALT + L tienen efecto todas estas configuraciones de estilo de código.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;ALT + ENTER&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;= Resaltar código y usar estas teclas para mostrar las acciones de contexto y cambiar el formato; se puede cambiar el&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;wrapping&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;de líneas muy largas con estas acciones de contexto.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;CTRL + ALT + SHIFT + L&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;= Reformatear todo el código del fichero (permite reformatear solo líneas de codigo modificadas o actuar sobre todo el fichero). Se puede reorganizar código&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;EditorConfig File&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;= Es un opción que permite crear este fichero para definir las reglas de estilo de código. Inicialmente el fichero contiene la misma configuración del IDE. Sobrescribe los settings del IDE, aunque esta posibilidad se puede desactivar. Se pueden crear diferentes ficheros de estilo de código por cada directorio, aunque esto no es buena práctica. Las entradas de configuracion duplicadas en un directorio se pueden eliminar si queremos que el estilo se herede del fichero padre.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;En la barra de estado en la parte inferior derecha podemos abrir el fichero de configuración de estilo que estamos utilizando.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;CTRL + Space&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;= Abre sugerencias para completar código para editar de propiedades de estilo&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;CTRL + SHIFT + A&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;= Find Action en una clase y buscar por&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;rearrange&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;para reorganizar el código de una clase de acuerdo a los settings. También se puede pulsar la opción de buscar en todos los sitios con&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;DOBLE- SHIFT&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;y buscar la opción de&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;rearrange code&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;para reorganizar código.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;Poner los métodos privados al final de los públicos = Abrir&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;Preferencias&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;de Editor /&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;Code Style&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;. En el tab de&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleEmphasizedBody; font-size: 19.73px; font-weight: bold;&quot;&gt;Arrangement&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&amp;nbsp;definir las reglas a aplicar.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;634&quot; src=&quot;https://www.youtube.com/embed/vjVWjocENLg&quot; width=&quot;764&quot; youtube-src-id=&quot;vjVWjocENLg&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 19.7px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-ligatures: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family: UICTFontTextStyleBody; font-size: 19.73px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;</description><link>http://spaceanalytics.blogspot.com/2023/07/reformatear-codigo-en-intellij.html</link><author>noreply@blogger.com (fglopez)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/vjVWjocENLg/default.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-1730899869257618104</guid><pubDate>Mon, 24 Jul 2023 18:31:00 +0000</pubDate><atom:updated>2023-07-24T20:31:37.588+02:00</atom:updated><title>Recursos Data Engineer</title><description>----------------------
ARTICULOS SPARK SCALA
----------------------

https://sparkbyexamples.com/spark/spark-setup-run-with-scala-intellij/&lt;div&gt;&lt;br /&gt;&lt;div&gt;https://medium.com/@Sushil_Kumar/setting-up-spark-with-scala-development-environment-using-intellij-idea-b22644f73ef1&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Instalar Java 8 en Ubuntu&amp;nbsp;&lt;/div&gt;&lt;div&gt;- https://computingforgeeks.com/how-to-install-java-8-on-ubuntu/&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Instalar intellij-idea en Ubuntu 20.04 LTS&amp;nbsp;&lt;/div&gt;&lt;div&gt;- https://youtu.be/zCkozcDBJ-A&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Instalar plugin Scala y crear Proyecto en IntelliJ&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://docs.scala-lang.org/getting-started/intellij-track/getting-started-with-scala-in-intellij.html&quot;&gt;https://docs.scala-lang.org/getting-started/intellij-track/getting-started-with-scala-in-intellij.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mi primera aplicacion Apache Spark en Scala con Maven en IntelliJ&amp;nbsp;&lt;/div&gt;&lt;div&gt;- &lt;a href=&quot;https://www.diegocalvo.es/mi-primera-aplicacion-apache-spark-en-scala-con-maven-en-intelligent-idea/&quot;&gt;https://www.diegocalvo.es/mi-primera-aplicacion-apache-spark-en-scala-con-maven-en-intelligent-idea/&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Create Scala Project with Maven in IntelliJ IDEA&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://javahelps.com/create-scala-project-with-maven-in-intellij-idea?amp=1&quot;&gt;https://javahelps.com/create-scala-project-with-maven-in-intellij-idea?amp=1&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Spark Scala con Maven en IntelliJ&amp;nbsp;&lt;/div&gt;&lt;div&gt;- &lt;a href=&quot;https://josedeveloper.com/2020/03/23/spark-scala-con-maven-en-intellij/&quot;&gt;https://josedeveloper.com/2020/03/23/spark-scala-con-maven-en-intellij/&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Configurar Scala SDK

Modificar fichero pom.xml con version de scala y dependencias spark - https://github.com/martinprobson/Spark-Scala-Maven-Example/blob/master/pom.xml&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Scala con Maven&amp;nbsp;&lt;/div&gt;&lt;div&gt;- https://docs.scala-lang.org/tutorials/scala-with-maven.html#the-scala-maven-plugin&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Scala on IntelliJ using Maven&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mxnet.apache.org/versions/1.7/api/scala/docs/tutorials/mxnet_scala_on_intellij&quot;&gt;https://mxnet.apache.org/versions/1.7/api/scala/docs/tutorials/mxnet_scala_on_intellij&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Crear App Spark usando el IDE de IntelliJ en Ubuntu&amp;nbsp;&lt;/div&gt;&lt;div&gt;- https://youtu.be/AP5JvdgiBME&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Usar Gradle para crear una aplicación simple en Spark Scala&amp;nbsp;&lt;/div&gt;&lt;div&gt;- https://medium.com/@yanggao1119/using-gradle-to-create-a-simple-scala-spark-application-d5f1740e741b&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Crear de manera rapida un proyecto scala usando gradle en intellij&amp;nbsp;&lt;/div&gt;&lt;div&gt;- http://www.legendu.net/misc/blog/scala-with-gradle-in-intellij/&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Iniciarse en Gradle con IntelliJ&amp;nbsp;&lt;/div&gt;&lt;div&gt;- https://www.jetbrains.com/help/idea/getting-started-with-gradle.html&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Generar un fichero JAR de una aplicación Scala con SBT&amp;nbsp;&lt;/div&gt;&lt;div&gt;- https://alvinalexander.com/scala/sbt-how-build-single-executable-jar-file-assembly/&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;Como configurar y estructurar una aplicación Spark en Scala&amp;nbsp;&lt;/div&gt;&lt;div&gt;- &lt;a href=&quot;https://godatadriven.com/blog/how-to-setup-and-structure-a-spark-application-in-scala/&quot;&gt;https://godatadriven.com/blog/how-to-setup-and-structure-a-spark-application-in-scala/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How to create maven project for Spark and Scala in Scala IDE -&amp;nbsp;&lt;a href=&quot;https://medium.com/@manojkumardhakad/how-to-create-maven-project-for-spark-and-scala-in-scala-ide-1a97ac003883&quot;&gt;https://medium.com/@manojkumardhakad/how-to-create-maven-project-for-spark-and-scala-in-scala-ide-1a97ac003883&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Create your first scala project with Maven -&amp;nbsp;&lt;a href=&quot;https://docs.scala-lang.org/tutorials/scala-with-maven.html&quot;&gt;https://docs.scala-lang.org/tutorials/scala-with-maven.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Create scala project with maven in IntelliJ Idea -&amp;nbsp;&lt;a href=&quot;https://www.javahelps.com/2021/03/create-scala-with-maven-project-in.html&quot;&gt;https://www.javahelps.com/2021/03/create-scala-with-maven-project-in.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Setting up a Spark development environment with Scala&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://www.cloudera.com/tutorials/setting-up-a-spark-development-environment-with-scala.html&quot;&gt;https://www.cloudera.com/tutorials/setting-up-a-spark-development-environment-with-scala.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Instalar Apache Spark y Scala&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://sundog-spark.s3.amazonaws.com/spark-install.pdf&quot;&gt;https://sundog-spark.s3.amazonaws.com/spark-install.pdf&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Setup Development Environment - Scala and Spark&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://kaizen.itversity.com/courses/aws-emr-and-spark-2-using-scala/lessons/setup-development-environment-for-scala-and-spark/topic/setup-development-environment-scala-and-spark/&quot;&gt;https://kaizen.itversity.com/courses/aws-emr-and-spark-2-using-scala/lessons/setup-development-environment-for-scala-and-spark/topic/setup-development-environment-scala-and-spark/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Creating a Spark Standalone Cluster with Docker and Docker Compose&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://dev.to/mvillarrealb/creating-a-spark-standalone-cluster-with-docker-and-docker-compose-2021-update-6l4&quot;&gt;https://dev.to/mvillarrealb/creating-a-spark-standalone-cluster-with-docker-and-docker-compose-2021-update-6l4&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Learning Scala on MacBook with MacOS 12 (Monterey)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://janrock.medium.com/learning-scala-and-akka-on-new-macbook-with-macos-12-monterey-f516193f1b5e&quot;&gt;https://janrock.medium.com/learning-scala-and-akka-on-new-macbook-with-macos-12-monterey-f516193f1b5e&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Setup homebrew on macOS Monterey&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://tech-cookbook.com/2021/10/25/how-to-setup-homebrew-brew-install-on-macos-12-monterey/&quot;&gt;https://tech-cookbook.com/2021/10/25/how-to-setup-homebrew-brew-install-on-macos-12-monterey/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Install Java on Mac with brew&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://adamtheautomator.com/install-java-on-mac/&quot;&gt;https://adamtheautomator.com/install-java-on-mac/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Setup Scala Spark project in IntelliJ using SBT build tool&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://medium.com/@Sushil_Kumar/setting-up-spark-with-scala-development-environment-using-intellij-idea-b22644f73ef1&quot;&gt;https://medium.com/@Sushil_Kumar/setting-up-spark-with-scala-development-environment-using-intellij-idea-b22644f73ef1&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Kernel de Scala para Jupyter&lt;/div&gt;&lt;div&gt;- &lt;a href=&quot;https://almond.sh/docs/intro&quot;&gt;https://almond.sh/docs/intro&lt;/a&gt;&lt;/div&gt;&lt;div&gt;- &lt;a href=&quot;https://github.com/almond-sh/examples&quot;&gt;https://github.com/almond-sh/examples&lt;/a&gt; &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Instalar Spark en Ubuntu&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://phoenixnap.com/kb/install-spark-on-ubuntu&quot;&gt;https://phoenixnap.com/kb/install-spark-on-ubuntu&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Spark setup with Scala and Run in IntelliJ&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://sparkbyexamples.com/spark/spark-setup-run-with-scala-intellij/?expand_article=1&quot;&gt;https://sparkbyexamples.com/spark/spark-setup-run-with-scala-intellij/?expand_article=1&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;——— LEER CONFIGURACIONES ——-&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Configuration Library for JVM Languages -&amp;nbsp;&lt;a href=&quot;https://github.com/lightbend/config&quot;&gt;https://github.com/lightbend/config&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Reading configurations In Scala -&amp;nbsp;&lt;a href=&quot;https://medium.com/@ramkarnani24/reading-configurations-in-scala-f987f839f54d&quot;&gt;https://medium.com/@ramkarnani24/reading-configurations-in-scala-f987f839f54d&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;TypeSafe Config Features and Example Usage -&amp;nbsp;&lt;a href=&quot;https://www.stubbornjava.com/posts/typesafe-config-features-and-example-usage&quot;&gt;https://www.stubbornjava.com/posts/typesafe-config-features-and-example-usage&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hoy to use the Lightbend Config library In a Scala of Java application -&amp;nbsp;&lt;a href=&quot;https://alvinalexander.com/scala/how-use-lightbend-config-library-scala-java-application/&quot;&gt;https://alvinalexander.com/scala/how-use-lightbend-config-library-scala-java-application/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Configuring Spark Applications with Typesafe Config -&amp;nbsp;&lt;a href=&quot;https://florentfo.rest/2019/01/07/configuring-spark-applications-with-typesafe-config.html&quot;&gt;https://florentfo.rest/2019/01/07/configuring-spark-applications-with-typesafe-config.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;-----
IDEs
--—&lt;/div&gt;&lt;div&gt;Working with Scala on IntelliJ&amp;nbsp;&lt;/div&gt;&lt;div&gt;- &lt;a href=&quot;https://www.jetbrains.com/help/idea/discover-intellij-idea-for-scala.html&quot;&gt;https://www.jetbrains.com/help/idea/discover-intellij-idea-for-scala.html&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Compile and build applications with IntelliJ&amp;nbsp;&lt;/div&gt;&lt;div&gt;- &lt;a href=&quot;https://www.jetbrains.com/help/idea/compiling-applications.html&quot;&gt;https://www.jetbrains.com/help/idea/compiling-applications.html&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Write and edit source code&amp;nbsp;&lt;/div&gt;&lt;div&gt;- &lt;a href=&quot;https://www.jetbrains.com/help/idea/working-with-source-code.html&quot;&gt;https://www.jetbrains.com/help/idea/working-with-source-code.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;————- JAVA —————————————————————-&lt;/div&gt;&lt;div&gt;Java full course for beginners (using IntelliJ) -&amp;nbsp;&lt;a href=&quot;https://youtu.be/Qgl81fPcLc8&quot;&gt;https://youtu.be/Qgl81fPcLc8&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;-----------------------------
PROGRAMA DE FORMACION DEVOPS
-----------------------------&lt;/div&gt;&lt;div&gt;&amp;nbsp;Git, GitHub and Gitlab - Curso de Atlassian en Coursera: Version Control with Git
CI/CD Pipeline with JEnkins - Cursos Udemy: 
- Jenkins, from zero to hero. Become a DevOps Jenkins Master 
- GitLab CI: Pipelines, CI/CD and DevOps for Beginners
Configuration Management with Chef, Puppet and Ansible
- Ansible for the absolute beginner - Hands-on - DevOps
- Curso Udemy: Dive into Ansible - From begginer to expert
- Todos los cursos en kodekloud.com
Docker Certified Associate Certification
- Todos los cursos en kodekloud.com
- Instalar Docker en Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Curso Docker y Devops: de novato a experto: https://www.udemy.com/share/102RT4BUQdeF5UQX4=/
- Desplegar una aplicación NodeJS con Docker: https://www.luigicolella.it/blog/how-to-create-nodejs-app-with-docker-1
- Dockerizar una App Scala: https://medium.com/@ievstrygul/dockerizing-scala-app-3fdf08cffda4
- dockerizar una aplicación Django - https://platzi.com/blog/django-docker/
- Como crear imagenes docker para Django - https://www.section.io/engineering-education/django-docker/
- Spark cluster with docker and docker-compose: https://github.com/fgarcialopez605/spark-essentials/tree/master/spark-cluster
Certified Kubernetes Administrator
- Todos los cursos en kodekloud.com
Devops on AWS
- Curso Udemy: AWS Certified DevOps Engineer (Requiere al menos el AWS Certified Developer)&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Apache Spark Cluster on Docker:&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://www.kdnuggets.com/2020/07/apache-spark-cluster-docker.html&quot;&gt;https://www.kdnuggets.com/2020/07/apache-spark-cluster-docker.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Spark clúster with docker&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://github.com/mvillarrealb/docker-spark-cluster&quot;&gt;https://github.com/mvillarrealb/docker-spark-cluster&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Apache Spark Standalone Cluster on Docker&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://github.com/cluster-apps-on-docker/spark-standalone-cluster-on-docker#tech-stack&quot;&gt;https://github.com/cluster-apps-on-docker/spark-standalone-cluster-on-docker#tech-stack&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;----------------------------
PROGRAMA CERTIFICACION CLOUD
----------------------------&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;a href=&quot;https://acloudguru.com/&quot;&gt;https://acloudguru.com/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;AWS Cloud Practitioner Certification&amp;nbsp;&lt;/div&gt;&lt;div&gt;- https://www.whizlabs.com/aws-certified-cloud-practitioner/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;AWS Certified Cloud Practitioner&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://www.udemy.com/share/103a09BUQdeF5UQX4=/&quot;&gt;https://www.udemy.com/share/103a09BUQdeF5UQX4=/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Official Google Cloud Certified Professional Data Engineer Study Guide&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://www.amazon.es/Official-Google-Certified-Professional-Engineer/dp/1119618436/ref=sr_1_1?__mk_es_ES=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;amp;dchild=1&amp;amp;keywords=Official+Google+Cloud+Certified+Professional+Data+Engineer+Study+Guide&amp;amp;qid=1620994245&amp;amp;sr=8-1&quot;&gt;https://www.amazon.es/Official-Google-Certified-Professional-Engineer/dp/1119618436/ref=sr_1_1?__mk_es_ES=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;amp;dchild=1&amp;amp;keywords=Official+Google+Cloud+Certified+Professional+Data+Engineer+Study+Guide&amp;amp;qid=1620994245&amp;amp;sr=8-1&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;AWS Certified Solutions Architect&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://www.udemy.com/course/aws-certified-solutions-architect-associate-saa-c02/&quot;&gt;https://www.udemy.com/course/aws-certified-solutions-architect-associate-saa-c02/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;AWS Certified Solutions Architect Study Guide&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://www.amazon.com/Certified-Solutions-Architect-Study-Guide-dp-111950421X/dp/111950421X?tag=javamysqlanta-20&quot;&gt;https://www.amazon.com/Certified-Solutions-Architect-Study-Guide-dp-111950421X/dp/111950421X?tag=javamysqlanta-20&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Prepare for AWS Solution Architect Associate Certification&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://medium.com/javarevisited/how-to-prepare-for-aws-solution-architect-associate-certification-saa-c01-saa-c02-exam-in-2021-a6e7e7e771fc&quot;&gt;https://medium.com/javarevisited/how-to-prepare-for-aws-solution-architect-associate-certification-saa-c01-saa-c02-exam-in-2021-a6e7e7e771fc&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;GCP Professional Data Engineer Dmitri Lerko -&amp;nbsp;&lt;a href=&quot;https://deploy.live/blog/google-cloud-certified-professional-data-engineer/&quot;&gt;https://deploy.live/blog/google-cloud-certified-professional-data-engineer/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Como superar el examen de data Engineer de Google cloud -&amp;nbsp;&lt;a href=&quot;https://dbibyhavas.io/es/blog/data-engineer-de-google-cloud/&quot;&gt;https://dbibyhavas.io/es/blog/data-engineer-de-google-cloud/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Desarrollo Python en Google Cloud&amp;nbsp;&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://cloud.google.com/python/docs/setup&quot;&gt;https://cloud.google.com/python/docs/setup&lt;/a&gt;&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://cloud.google.com/python&quot;&gt;https://cloud.google.com/python&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Desarrollo Java en Google Cloud&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://cloud.google.com/java/docs/setup&quot;&gt;https://cloud.google.com/java/docs/setup&lt;/a&gt;&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://cloud.google.com/java/docs/setup&quot;&gt;https://cloud.google.com/java&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;—————————- PROGRAMA CERTIFICACIÓN SPARK ——————————-&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Como aprobar la certificación Databricks Spark 3.0&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;http://josedeveloper.com/2021/04/30/como-aprobar-la-certificacion-databricks-spark-3-0/&quot;&gt;http://josedeveloper.com/2021/04/30/como-aprobar-la-certificacion-databricks-spark-3-0/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;-------------------
MAQUINAS VIRTUALES
-------------------&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;Install Ubuntu 20.04 LTS on VirtualBox in Windows 10 
- https://youtu.be/x5MhydijWmc
- https://gadgetliv.com/install-ubuntu-on-virtualbox-in-windows/&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How to install Ubuntu in VirtualBox on Windows 10&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://youtu.be/IOwlnpWPuj0&quot;&gt;https://youtu.be/IOwlnpWPuj0&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Como empezar a trabajar con un contenedor Docker de Cloudera QuickStart&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://medium.com/@SnazzyHam/how-to-get-up-and-running-with-clouderas-quickstart-docker-container-732c04ed0280&quot;&gt;https://medium.com/@SnazzyHam/how-to-get-up-and-running-with-clouderas-quickstart-docker-container-732c04ed0280&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Proyecto Vagrant para arrancar una máquina virtual con Hadoop/Spark&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://github.com/martinprobson/vagrant-hadoop-hive-spark&quot;&gt;https://github.com/martinprobson/vagrant-hadoop-hive-spark&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;--------------------
DESARROLLO PYTHON
--------------------&lt;/div&gt;&lt;div&gt;&amp;nbsp;Jupyter Notebooks, JupyterLab, Zeppelin, Anaconda, Spyder&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;Iniciar un proyecto de ciencia de datos con Anaconda en Python - &lt;a href=&quot;http://spaceanalytics.blogspot.com/2020/11/iniciar-un-proyecto-de-ciencia-de-datos.html &quot; target=&quot;_blank&quot;&gt;http://spaceanalytics.blogspot.com/2020/11/iniciar-un-proyecto-de-ciencia-de-datos.html&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Empezar a trabajar con Apache Spark y Python&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://www.sundog-education.com/spark-python/&quot;&gt;https://www.sundog-education.com/spark-python/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;Introducción práctica al analisis de datos en python&amp;nbsp;&lt;/div&gt;&lt;div&gt;- &lt;a href=&quot;https://towardsdatascience.com/a-beginners-guide-to-data-analysis-in-python-188706df5447&quot;&gt;https://towardsdatascience.com/a-beginners-guide-to-data-analysis-in-python-188706df5447&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Instalar un entorno de desarrollo Python3 en Ubuntu 20.04&amp;nbsp;&lt;/div&gt;&lt;div&gt;- &lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-programming-environment-on-an-ubuntu-20-04-server &quot;&gt;https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-programming-environment-on-an-ubuntu-20-04-server&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Creación de proyectos Python en IntelliJ&amp;nbsp;&lt;/div&gt;&lt;div&gt;- &lt;a href=&quot;https://www.jetbrains.com/help/idea/plugin-overview.html &quot; target=&quot;_blank&quot;&gt;https://www.jetbrains.com/help/idea/plugin-overview.html&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Introducción a MongoDB, PySpark y Jupyter Notebook&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://www.mongodb.com/blog/post/getting-started-with-mongodb-pyspark-and-jupyter-notebook&quot;&gt;https://www.mongodb.com/blog/post/getting-started-with-mongodb-pyspark-and-jupyter-notebook&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Setup PySpark environment on Ubuntu&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://medium.com/@GalarnykMichael/install-spark-on-ubuntu-pyspark-231c45677de0&quot;&gt;https://medium.com/@GalarnykMichael/install-spark-on-ubuntu-pyspark-231c45677de0&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Setup JupyterLab Environment on Ubuntu&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-set-up-a-jupyterlab-environment-on-ubuntu-18-04&quot;&gt;https://www.digitalocean.com/community/tutorials/how-to-set-up-a-jupyterlab-environment-on-ubuntu-18-04&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Install PySpark on Ubuntu&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://t.co/UdzmhAaTKi&quot;&gt;https://t.co/UdzmhAaTKi&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://www.roseindia.net/bigdata/pyspark/install-pyspark-on-ubuntu.shtml&quot;&gt;https://www.roseindia.net/bigdata/pyspark/install-pyspark-on-ubuntu.shtml&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Install PySpark locally and use it with Jupyter Notebook&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://youtu.be/MLXOy-OhWRY&quot;&gt;https://youtu.be/MLXOy-OhWRY&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PySpark crash course in 50 minutes&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://youtu.be/6rgoqfzX_YI&quot;&gt;https://youtu.be/6rgoqfzX_YI&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PySpark Tutorial for Beginners&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://sparkbyexamples.com/pyspark-tutorial/&quot;&gt;https://sparkbyexamples.com/pyspark-tutorial/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Instalar Anaconda Python en Ubuntu 20.04&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-install-the-anaconda-python-distribution-on-ubuntu-20-04-es&quot;&gt;https://www.digitalocean.com/community/tutorials/how-to-install-the-anaconda-python-distribution-on-ubuntu-20-04-es&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Documentación oficial de Anaconda&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://docs.anaconda.com/anaconda/&quot;&gt;https://docs.anaconda.com/anaconda/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;JupyterLab in a virtual environment&amp;nbsp;&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://dev.to/joeneville_/jupyterlab-in-a-virtual-environment-gf5&quot;&gt;https://dev.to/joeneville_/jupyterlab-in-a-virtual-environment-gf5&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Use Virtual Environments Inside Jupyter Notebooks &amp;amp; JupyterLab&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://www.zainrizvi.io/blog/jupyter-notebooks-best-practices-use-virtual-environments/&quot;&gt;https://www.zainrizvi.io/blog/jupyter-notebooks-best-practices-use-virtual-environments/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Create Django App on Ubuntu Server&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://linuxhint.com/create_django_app_ubuntu/&quot;&gt;https://linuxhint.com/create_django_app_ubuntu/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Documentación oficial de Conda&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://conda.io/projects/conda/en/latest/user-guide/getting-started.html&quot;&gt;https://conda.io/projects/conda/en/latest/user-guide/getting-started.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Como instalar Python 3 y entornos virtuales con miniconda en Ubuntu&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://thucnc.medium.com/how-to-install-python-3-and-virtual-environments-with-miniconda-in-ubuntu-18-04-c9e000a39994&quot;&gt;https://thucnc.medium.com/how-to-install-python-3-and-virtual-environments-with-miniconda-in-ubuntu-18-04-c9e000a39994&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Gestionar múltiples versiones de Python en Ubuntu&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://hackersandslackers.com/multiple-versions-python-ubuntu/&quot;&gt;https://hackersandslackers.com/multiple-versions-python-ubuntu/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;Otros
-----

http://www.blogdelujo.com/2010/01/ver-incrustar-otra-web-en-blog.html









&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;—————————DESARROLLO KAFKA ——————-&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Desarrollo de aplicaciones Kafka con Scala -&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://www.confluent.io/blog/kafka-scala-tutorial-for-beginners/&quot;&gt;https://www.confluent.io/blog/kafka-scala-tutorial-for-beginners/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Kafka Streams DSL en Scala -&amp;nbsp;&lt;a href=&quot;https://medium.com/@danieljameskay/kafka-streams-dsl-for-scala-the-basics-11d603295f5c&quot;&gt;https://medium.com/@danieljameskay/kafka-streams-dsl-for-scala-the-basics-11d603295f5c&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;———— KUDU / IMPALA —————&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Montar una infraestructura Docker que usa Impala para operar con Kudu&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://github.com/apache/kudu/tree/master/examples/quickstart/impala&quot;&gt;https://github.com/apache/kudu/tree/master/examples/quickstart/impala&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oficial Kudu -&amp;nbsp;&lt;a href=&quot;https://kudu.apache.org/&quot;&gt;https://kudu.apache.org/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oficial Impala -&amp;nbsp;&lt;a href=&quot;https://impala.apache.org/index.html&quot;&gt;https://impala.apache.org/index.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tutoríales prácticos de Impala -&amp;nbsp;&lt;a href=&quot;https://impala.apache.org/docs/build/html/topics/impala_tutorial.html&quot;&gt;https://impala.apache.org/docs/build/html/topics/impala_tutorial.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Building real time BI systems with Kafka, Spark and Kudu -&amp;nbsp;&lt;a href=&quot;https://databricks.com/session/building-real-time-bi-systems-with-kafka-spark-and-kudu&quot;&gt;https://databricks.com/session/building-real-time-bi-systems-with-kafka-spark-and-kudu&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Apache Kudu and Spark SQL for fast Analytics on fast data -&amp;nbsp;&lt;a href=&quot;https://databricks.com/session/apache-kudu-and-spark-sql-for-fast-analytics-on-fast-data&quot;&gt;https://databricks.com/session/apache-kudu-and-spark-sql-for-fast-analytics-on-fast-data&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CERTIFICACIÓN GCP DATA ENGINEER&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://www.cloudskillsboost.google/paths/16&quot;&gt;https://www.cloudskillsboost.google/paths/16&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;h2 class=&quot;ytp-related-title&quot; style=&quot;-webkit-tap-highlight-color: rgba(0, 0, 0, 0); -webkit-text-size-adjust: auto; background-color: rgba(23, 23, 23, 0.9); caret-color: rgb(238, 238, 238); color: #eeeeee; font-family: &amp;quot;YouTube Noto&amp;quot;, Roboto, Arial, Helvetica, sans-serif; font-size: 14px; font-weight: 500; line-height: 20px; margin: 0px 0px 12px 4px; text-size-adjust: auto;&quot;&gt;&lt;br /&gt;&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://youtu.be/w2_ukhoLGEM&quot;&gt;https://youtu.be/w2_ukhoLGEM&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Usar Google Dataproc con PySpark y Jupyter Notebook&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://morioh.com/p/2c1e7be91f53&quot;&gt;https://morioh.com/p/2c1e7be91f53&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Run PySpark job on Dataproc&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://acloudguru.com/hands-on-labs/running-a-pyspark-job-on-cloud-dataproc-using-google-cloud-storage&quot;&gt;https://acloudguru.com/hands-on-labs/running-a-pyspark-job-on-cloud-dataproc-using-google-cloud-storage&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;GENERAL DATA ENGINEER&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://awesomedataengineering.com/&quot;&gt;https://awesomedataengineering.com/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://medium.com/coriers/data-engineering-roadmap-for-2021-eac7898f0641&quot;&gt;https://medium.com/coriers/data-engineering-roadmap-for-2021-eac7898f0641&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Setting up a Dev Environment for Data Engineers&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-&amp;nbsp;&lt;a href=&quot;https://discuss.itversity.com/t/data-engineers-setting-up-the-development-environment/19879&quot;&gt;https://discuss.itversity.com/t/data-engineers-setting-up-the-development-environment/19879&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Data Architecture Articles&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://medium.com/tag/data-architecture&quot;&gt;https://medium.com/tag/data-architecture&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How to become a Data Architect&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://techguide.org/careers/data-architect/&quot;&gt;https://techguide.org/careers/data-architect/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Top Data Architect and Data Engineer Certifications&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://www.techtarget.com/whatis/feature/8-top-data-architect-and-data-engineer-certifications&quot;&gt;https://www.techtarget.com/whatis/feature/8-top-data-architect-and-data-engineer-certifications&lt;/a&gt;&lt;/div&gt;</description><link>http://spaceanalytics.blogspot.com/2023/07/recursos-data-engineer.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-1395382738472872914</guid><pubDate>Wed, 12 Jul 2023 15:30:00 +0000</pubDate><atom:updated>2023-07-12T17:38:42.880+02:00</atom:updated><title>Transformar dataframe spark</title><description>&lt;p&gt;&amp;nbsp;&lt;span face=&quot;&amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace&quot; style=&quot;background-color: black; color: white; font-size: 14px; white-space: pre;&quot;&gt;def transformArrayStruct(df: DataFrame): DataFrame = {&lt;/span&gt;&lt;/p&gt;&lt;span face=&quot;&amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace&quot; style=&quot;background-color: black; color: white; font-size: 14px; white-space: pre;&quot;&gt;  df.withColumn(&quot;array_of_struct&quot;, expr(&quot;transform(array_of_struct, x -&amp;gt; struct(x.a, x.c))&quot;))
}&lt;/span&gt;&lt;div&gt;&lt;span face=&quot;&amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace&quot; style=&quot;background-color: black; color: white; font-size: 14px; white-space: pre;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face=&quot;&amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace&quot; style=&quot;background-color: black; color: white; font-size: 14px; white-space: pre;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face=&quot;&amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace&quot; style=&quot;background-color: black; color: white; font-size: 14px; white-space: pre;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face=&quot;&amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace&quot; style=&quot;background-color: black; color: white; font-size: 14px; white-space: pre;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace;&quot;&gt;import org.apache.spark.sql.functions.{col, isArray, isStruct}
import org.apache.spark.sql.{DataFrame, SparkSession}

def isColumnArrayStruct(df: DataFrame, columnName: String): Boolean = {
  val arrayCheck = isArray(col(columnName))
  val structCheck = isStruct(element_at(col(columnName), 1))

  df.select(arrayCheck &amp;amp;&amp;amp; structCheck).as[Boolean].head()
}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</description><link>http://spaceanalytics.blogspot.com/2023/07/transformar-dataframe-spark.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-7022356289934210682</guid><pubDate>Thu, 06 Jul 2023 08:53:00 +0000</pubDate><atom:updated>2023-07-06T10:53:20.001+02:00</atom:updated><title>Extraer partes del nombre de una entidad MySQL</title><description>&lt;p&gt;&amp;nbsp;Problema:&amp;nbsp;&lt;span style=&quot;color: #343541; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;Tengo un String que es una dirección mysql de una tabla y quiero hacer una función scala que devuelva una lista con 2 elementos, el primero con la parte izquierda de la dirección mysql hasta el último carácter / (sin incluirlo) y el segundo con la parte derecha que hay después del carácter /, que corresponde a la base de datos.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;Puedes lograr esto en Scala utilizando métodos de manipulación de cadenas. Aquí tienes una función que toma una dirección MySQL y devuelve una lista con la parte izquierda y derecha de la dirección:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #f7f7f8; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;&quot;&gt;def splitMySQLAddress(address: String): List[String] = {
  val lastIndex = address.lastIndexOf(&quot;/&quot;)
  
  val leftPart = address.substring(0, lastIndex)
  val rightPart = address.substring(lastIndex + 1)
  
  List(leftPart, rightPart)
}
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;Aquí tienes un ejemplo de cómo puedes usar esta función:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #f7f7f8; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;&quot;&gt;val mysqlAddress = &quot;jdbc:mysql://localhost:3306/mydatabase&quot;
val parts = splitMySQLAddress(mysqlAddress)

println(parts) // Imprime: List(jdbc:mysql://localhost:3306, mydatabase)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space-collapse: preserve;&quot;&gt;En este ejemplo, la función &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;splitMySQLAddress&lt;/code&gt; toma la dirección MySQL como entrada y utiliza el método &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;lastIndexOf&lt;/code&gt; para encontrar la posición del último carácter &quot;/&quot;. Luego, utiliza el método &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;substring&lt;/code&gt; para dividir la dirección en dos partes, la parte izquierda y la parte derecha. Estas partes se agregan a una lista y se devuelve como resultado.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space-collapse: preserve;&quot;&gt;Ten en cuenta que esta implementación asume que la dirección MySQL siempre tiene el formato esperado, es decir, tiene al menos un carácter &quot;/&quot; y no contiene más de un carácter &quot;/&quot; al final de la parte izquierda. Si necesitas manejar casos especiales, como direcciones incorrectas o formatos diferentes, puedes ajustar la función según tus necesidades.&lt;/p&gt;&lt;/div&gt;</description><link>http://spaceanalytics.blogspot.com/2023/07/extraer-partes-del-nombre-de-una.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-8332130674073961007</guid><pubDate>Thu, 22 Jun 2023 11:10:00 +0000</pubDate><atom:updated>2023-06-22T13:10:20.184+02:00</atom:updated><title>Comparación de esquema entre Parquet y Athena</title><description>&lt;p&gt;&amp;nbsp;Versión 1:&lt;/p&gt;&lt;p&gt;from pyspark.sql import SparkSession&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;# Crear la sesión de Spark&lt;/p&gt;&lt;p&gt;spark = SparkSession.builder \&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .appName(&quot;Comparar Esquema de Parquet y Tabla en Athena&quot;) \&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .config(&quot;hive.metastore.glue.catalog.id&quot;, &quot;glue_catalog_id&quot;) \&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .enableHiveSupport() \&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .getOrCreate()&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;# Nombre de la base de datos y tabla en Athena&lt;/p&gt;&lt;p&gt;database_name = &quot;nombre_base_de_datos&quot;&lt;/p&gt;&lt;p&gt;table_name = &quot;nombre_tabla&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;# Ruta del archivo Snappy Parquet&lt;/p&gt;&lt;p&gt;parquet_file_path = &quot;ruta_del_archivo.parquet&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;# Leer el esquema del archivo Snappy Parquet&lt;/p&gt;&lt;p&gt;parquet_df = spark.read.format(&quot;parquet&quot;).load(parquet_file_path)&lt;/p&gt;&lt;p&gt;parquet_schema = parquet_df.schema&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;# Leer el esquema de la tabla en Athena&lt;/p&gt;&lt;p&gt;athena_df = spark.table(f&quot;{database_name}.{table_name}&quot;)&lt;/p&gt;&lt;p&gt;athena_schema = athena_df.schema&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;# Comparar los esquemas&lt;/p&gt;&lt;p&gt;if parquet_schema == athena_schema:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; print(&quot;El esquema del archivo Snappy Parquet y la tabla en Athena son iguales.&quot;)&lt;/p&gt;&lt;p&gt;else:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; print(&quot;El esquema del archivo Snappy Parquet y la tabla en Athena son diferentes.&quot;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;# Cerrar la sesión de Spark&lt;/p&gt;&lt;p&gt;spark.stop()&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;Una mejora al código anterior para que imprima las diferencias entre el esquema del archivo Snappy Parquet y el esquema de la tabla en Athena:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #f7f7f8; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;&quot;&gt;from pyspark.sql import SparkSession

# Crear la sesión de Spark
spark = SparkSession.builder \
    .appName(&quot;Comparar Esquema de Parquet y Tabla en Athena&quot;) \
    .config(&quot;hive.metastore.glue.catalog.id&quot;, &quot;glue_catalog_id&quot;) \
    .enableHiveSupport() \
    .getOrCreate()

# Nombre de la base de datos y tabla en Athena
database_name = &quot;nombre_base_de_datos&quot;
table_name = &quot;nombre_tabla&quot;

# Ruta del archivo Snappy Parquet
parquet_file_path = &quot;ruta_del_archivo.parquet&quot;

# Leer el esquema del archivo Snappy Parquet
parquet_df = spark.read.format(&quot;parquet&quot;).load(parquet_file_path)
parquet_schema = parquet_df.schema

# Leer el esquema de la tabla en Athena
athena_df = spark.table(f&quot;{database_name}.{table_name}&quot;)
athena_schema = athena_df.schema

# Obtener las columnas presentes en el esquema del archivo Snappy Parquet pero no en el esquema de la tabla en Athena
missing_columns_in_athena = set(parquet_schema.fieldNames()) - set(athena_schema.fieldNames())

# Obtener las columnas presentes en el esquema de la tabla en Athena pero no en el esquema del archivo Snappy Parquet
missing_columns_in_parquet = set(athena_schema.fieldNames()) - set(parquet_schema.fieldNames())

if missing_columns_in_athena:
    print(&quot;Columnas presentes en el archivo Snappy Parquet pero no en la tabla de Athena:&quot;)
    for column in missing_columns_in_athena:
        print(column)

if missing_columns_in_parquet:
    print(&quot;Columnas presentes en la tabla de Athena pero no en el archivo Snappy Parquet:&quot;)
    for column in missing_columns_in_parquet:
        print(column)

# Cerrar la sesión de Spark
spark.stop()&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;Una mejora adicional al programa anterior para que también imprima las diferencias en el tipo de columna entre el esquema del archivo Snappy Parquet y el esquema de la tabla en Athena:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #f7f7f8; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;&quot;&gt;from pyspark.sql import SparkSession

# Crear la sesión de Spark
spark = SparkSession.builder \
    .appName(&quot;Comparar Esquema de Parquet y Tabla en Athena&quot;) \
    .config(&quot;hive.metastore.glue.catalog.id&quot;, &quot;glue_catalog_id&quot;) \
    .enableHiveSupport() \
    .getOrCreate()

# Nombre de la base de datos y tabla en Athena
database_name = &quot;nombre_base_de_datos&quot;
table_name = &quot;nombre_tabla&quot;

# Ruta del archivo Snappy Parquet
parquet_file_path = &quot;ruta_del_archivo.parquet&quot;

# Leer el esquema del archivo Snappy Parquet
parquet_df = spark.read.format(&quot;parquet&quot;).load(parquet_file_path)
parquet_schema = parquet_df.schema

# Leer el esquema de la tabla en Athena
athena_df = spark.table(f&quot;{database_name}.{table_name}&quot;)
athena_schema = athena_df.schema

# Obtener las columnas presentes en el esquema del archivo Snappy Parquet pero no en el esquema de la tabla en Athena
missing_columns_in_athena = set(parquet_schema.fieldNames()) - set(athena_schema.fieldNames())

# Obtener las columnas presentes en el esquema de la tabla en Athena pero no en el esquema del archivo Snappy Parquet
missing_columns_in_parquet = set(athena_schema.fieldNames()) - set(parquet_schema.fieldNames())

# Obtener las columnas con tipos diferentes entre el esquema del archivo Snappy Parquet y el esquema de la tabla en Athena
different_type_columns = []
for field in parquet_schema.fields:
    if field.name in athena_schema:
        athena_field = athena_schema[field.name]
        if field.dataType != athena_field.dataType:
            different_type_columns.append((field.name, field.dataType, athena_field.dataType))

if missing_columns_in_athena:
    print(&quot;Columnas presentes en el archivo Snappy Parquet pero no en la tabla de Athena:&quot;)
    for column in missing_columns_in_athena:
        print(column)

if missing_columns_in_parquet:
    print(&quot;Columnas presentes en la tabla de Athena pero no en el archivo Snappy Parquet:&quot;)
    for column in missing_columns_in_parquet:
        print(column)

if different_type_columns:
    print(&quot;Columnas con tipos diferentes entre el archivo Snappy Parquet y la tabla de Athena:&quot;)
    for column, parquet_type, athena_type in different_type_columns:
        print(f&quot;Columna: {column}, Tipo en Parquet: {parquet_type}, Tipo en Athena: {athena_type}&quot;)

# Cerrar la sesión de Spark
spark.stop()&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;</description><link>http://spaceanalytics.blogspot.com/2023/06/comparacion-de-esquema-entre-parquet-y.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-7602955728850300472</guid><pubDate>Mon, 19 Jun 2023 12:09:00 +0000</pubDate><atom:updated>2023-06-19T14:09:56.204+02:00</atom:updated><title>Prueba de lectura de Parameter Store en ScalaTest</title><description>&lt;p&gt;&amp;nbsp;import org.scalatest.flatspec.AnyFlatSpec&lt;/p&gt;&lt;p&gt;import org.scalatest.matchers.should.Matchers&lt;/p&gt;&lt;p&gt;import org.scalatestplus.mockito.MockitoSugar&lt;/p&gt;&lt;p&gt;import software.amazon.awssdk.services.ssm.SsmClient&lt;/p&gt;&lt;p&gt;import software.amazon.awssdk.services.ssm.model.{GetParameterRequest, GetParameterResponse, Parameter}&lt;/p&gt;&lt;p&gt;import scala.util.{Success, Try}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;trait ParameterStoreReader {&lt;/p&gt;&lt;p&gt;&amp;nbsp; protected val ssmClient: SsmClient&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; def getParameter(parameterName: String): Try[String] = {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val request = GetParameterRequest.builder().name(parameterName).build()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val response = ssmClient.getParameter(request)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Success(response.parameter().value())&lt;/p&gt;&lt;p&gt;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;class ParameterStoreReaderSpec extends AnyFlatSpec with Matchers with MockitoSugar {&lt;/p&gt;&lt;p&gt;&amp;nbsp; it should &quot;retrieve a parameter from AWS Parameter Store&quot; in {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val expectedParameterValue = &quot;parameterValue&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Create a mock SsmClient&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val ssmClientMock: SsmClient = mock[SsmClient]&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Create an instance of the trait to be tested, passing the mock SsmClient&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val parameterStoreReader: ParameterStoreReader = new ParameterStoreReader {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; override protected val ssmClient: SsmClient = ssmClientMock&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Simulate the response from AWS Parameter Store&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val response = GetParameterResponse.builder()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .parameter(Parameter.builder()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .name(&quot;parameterName&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .value(expectedParameterValue)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .build())&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .build()&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Stub the getParameter method of the mock SsmClient&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; when(ssmClientMock.getParameter(any[GetParameterRequest])).thenReturn(response)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Test the getParameter method&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val result = parameterStoreReader.getParameter(&quot;parameterName&quot;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; result shouldBe Success(expectedParameterValue)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Verify that the getParameter method was called with the correct parameter name&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; verify(ssmClientMock).getParameter(GetParameterRequest.builder().name(&quot;parameterName&quot;).build())&lt;/p&gt;&lt;p&gt;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://spaceanalytics.blogspot.com/2023/06/prueba-de-lectura-de-parameter-store-en.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-9147289846337829537</guid><pubDate>Fri, 16 Jun 2023 21:31:00 +0000</pubDate><atom:updated>2023-06-16T23:31:42.007+02:00</atom:updated><title>Pruebas unitarias de llamada a APIs en ScalaTest</title><description>&lt;p&gt;&amp;nbsp;import org.scalatest.flatspec.AnyFlatSpec&lt;/p&gt;&lt;p&gt;import org.scalatest.matchers.should.Matchers&lt;/p&gt;&lt;p&gt;import requests.Response&lt;/p&gt;&lt;p&gt;import scala.collection.mutable&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;object DatahubGraphqlProcessor {&lt;/p&gt;&lt;p&gt;&amp;nbsp; def sendRequest(url: String): Response = {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Realizar la petición a la API y obtener la respuesta&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // ...&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Simulamos una respuesta ficticia para el ejemplo&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val mockResponseCode: Int = 200&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val mockResponseText: String = &quot;&quot;&quot;{&quot;message&quot;: &quot;Mock response&quot;}&quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Response(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; statusCode = mockResponseCode,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; headers = Map.empty,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; body = mockResponseText&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; )&lt;/p&gt;&lt;p&gt;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; def parseResponse(responseText: String): mutable.Map[String, List[String]] = {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Parsear el texto JSON y construir el mapa mutable&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // ...&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Simulamos un resultado ficticio para el ejemplo&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val parsedResult: mutable.Map[String, List[String]] = mutable.Map(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;key1&quot; -&amp;gt; List(&quot;value1&quot;, &quot;value2&quot;),&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;key2&quot; -&amp;gt; List(&quot;value3&quot;, &quot;value4&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; )&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; parsedResult&lt;/p&gt;&lt;p&gt;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;class DatahubGraphqlProcessorSpec extends AnyFlatSpec with Matchers {&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; val mockResponseCode: Int = 200&lt;/p&gt;&lt;p&gt;&amp;nbsp; val mockResponseText: String = &quot;&quot;&quot;{&quot;message&quot;: &quot;Mock response&quot;}&quot;&quot;&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &quot;DatahubGraphqlProcessor&quot; should &quot;simular la llamada a la API REST y parsear la respuesta&quot; in {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Mockear la llamada a la API&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val mockDatahubGraphqlProcessor = new DatahubGraphqlProcessor {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; override def sendRequest(url: String): Response = {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Simular la respuesta de la API&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Response(&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; statusCode = mockResponseCode,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; headers = Map.empty,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; body = mockResponseText&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Realizar la llamada y verificar la respuesta&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val response: Response = mockDatahubGraphqlProcessor.sendRequest(&quot;https://api.example.com/graphql&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; response.statusCode shouldEqual mockResponseCode&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; response.text() shouldEqual mockResponseText&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Parsear la respuesta&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val parsedResult: mutable.Map[String, List[String]] = mockDatahubGraphqlProcessor.parseResponse(response.text())&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Verificar el resultado del parsing&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; parsedResult(&quot;key1&quot;) shouldEqual List(&quot;value1&quot;, &quot;value2&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; parsedResult(&quot;key2&quot;) shouldEqual List(&quot;value3&quot;, &quot;value4&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://spaceanalytics.blogspot.com/2023/06/pruebas-unitarias-de-llamada-apis-en.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-4467747071072730304</guid><pubDate>Fri, 16 Jun 2023 20:31:00 +0000</pubDate><atom:updated>2023-06-16T23:30:01.782+02:00</atom:updated><title>Pruebas unitarias de tipo mock en ScalaTest (SsmUtils)</title><description>&lt;p&gt;&amp;nbsp;&lt;span face=&quot;Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;&quot; style=&quot;-webkit-text-size-adjust: 100%; caret-color: rgb(55, 65, 81); color: #374151; font-size: 16px; white-space: pre-wrap;&quot;&gt;No es posible simular la instanciación de un cliente SsmClient con un Parameter Store en local para pruebas unitarias utilizando credenciales anónimas. La biblioteca AWS SDK requiere autenticación válida para acceder a los servicios de AWS, incluido Parameter Store.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space: pre-wrap;&quot;&gt;En las pruebas unitarias, es recomendable utilizar enfoques de simulación o mocking para simular el comportamiento de las llamadas a servicios externos, en lugar de intentar ejecutarlos localmente. Puedes utilizar bibliotecas de simulación como Mockito, MockServer u otros frameworks similares para simular las respuestas de las llamadas a los servicios de AWS, incluyendo la respuesta del Parameter Store.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space: pre-wrap;&quot;&gt;En lugar de interactuar con el Parameter Store real durante las pruebas unitarias, puedes crear mocks o stubs para simular las respuestas del Parameter Store y probar el comportamiento de tu código en función de esas respuestas simuladas. Esto te permitirá aislar tus pruebas y hacerlas más rápidas, predecibles y menos dependientes de recursos externos como el Parameter Store de AWS.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;Recuerda que las pruebas unitarias se centran en probar la lógica interna de tu código de manera aislada, sin depender de servicios externos. Por lo tanto, es preferible simular o simular parcialmente los servicios externos para garantizar pruebas más confiables y eficientes.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import software.amazon.awssdk.services.ssm.SsmClient
import software.amazon.awssdk.services.ssm.model.{GetParameterRequest, GetParameterResponse}

trait MyParameterStore {
  implicit val ssmClient: SsmClient

  def getParameterValue(parameterName: String): String = {
    val request = GetParameterRequest.builder()
      .name(parameterName)
      .build()
    val response = ssmClient.getParameter(request)
    response.parameter().value()
  }
}

class MyParameterStoreSpec extends AnyFlatSpec with Matchers with MyParameterStore {

  // Cliente Ssm simulado para las pruebas
  implicit val ssmClient: SsmClient = new SsmClient {
    override def getParameter(request: GetParameterRequest): GetParameterResponse = {
      request.name() match {
        case &quot;parameter1&quot; =&amp;gt; 
          GetParameterResponse.builder()
            .parameter(Parameter.builder()
              .name(request.name())
              .value(&quot;value1&quot;)
              .build())
            .build()
        case &quot;parameter2&quot; =&amp;gt; 
          GetParameterResponse.builder()
            .parameter(Parameter.builder()
              .name(request.name())
              .value(&quot;value2&quot;)
              .build())
            .build()
        case _ =&amp;gt;
          throw new IllegalArgumentException(s&quot;Unknown parameter: ${request.name()}&quot;)
      }
    }
  }

  &quot;MyParameterStore&quot; should &quot;obtener un parámetro del Parameter Store&quot; in {
    val parameterValue1 = getParameterValue(&quot;parameter1&quot;)
    parameterValue1 should be(&quot;value1&quot;)

    val parameterValue2 = getParameterValue(&quot;parameter2&quot;)
    parameterValue2 should be(&quot;value2&quot;)
  }
}
&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space: pre-wrap;&quot;&gt;En este ejemplo, el trait &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;MyParameterStore&lt;/code&gt; define un valor implícito &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;ssmClient&lt;/code&gt; de tipo &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;SsmClient&lt;/code&gt;. La clase de prueba &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;MyParameterStoreSpec&lt;/code&gt; extiende &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;AnyFlatSpec&lt;/code&gt;, &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;Matchers&lt;/code&gt; y &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;MyParameterStore&lt;/code&gt;. Al mezclar &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;MyParameterStore&lt;/code&gt; en la clase de prueba, se puede sobrescribir el valor implícito &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;ssmClient&lt;/code&gt; para utilizar un cliente Ssm simulado en lugar de uno real.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space: pre-wrap;&quot;&gt;Dentro del cliente Ssm simulado, se utiliza una coincidencia de patrones (&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;match&lt;/code&gt;) para determinar qué parámetro se está solicitando y devolver una respuesta simulada correspondiente. En el ejemplo, se simulan dos parámetros diferentes: &quot;parameter1&quot; y &quot;parameter2&quot;, con sus respectivos valores &quot;value1&quot; y &quot;value2&quot;.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space: pre-wrap;&quot;&gt;En el caso de prueba, se llama al método &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;getParameterValue&lt;/code&gt; de &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;MyParameterStore&lt;/code&gt; y se verifica que los valores de los parámetros sean los esperados.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;Recuerda adaptar este código a tus necesidades específicas y utilizar los nombres de parámetros y valores correctos para tu caso de uso.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://spaceanalytics.blogspot.com/2023/06/pruebas-unitarias-de-tipo-mock-en.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-1339184579466026713</guid><pubDate>Wed, 14 Jun 2023 12:11:00 +0000</pubDate><atom:updated>2023-06-14T14:11:37.661+02:00</atom:updated><title>Generar un ZIP de objetos S3 con un prefijo de clave comun</title><description>&lt;p&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;En este código, el trait &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space-collapse: preserve;&quot;&gt;S3ZipManager&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt; se encarga de las responsabilidades relacionadas con la generación del archivo ZIP y la subida a S3. El objeto &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space-collapse: preserve;&quot;&gt;S3ZipGenerator&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt; extiende este trait y proporciona la implementación de los valores &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space-collapse: preserve;&quot;&gt;bucketName&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt; y &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space-collapse: preserve;&quot;&gt;s3KeyPrefix&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;. Luego, en el método &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space-collapse: preserve;&quot;&gt;main&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;, simplemente llamamos al método &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space-collapse: preserve;&quot;&gt;generateAndUploadZip()&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt; para generar y subir el archivo ZIP.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;hemos extraído la lógica repetitiva a métodos privados. El método &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space-collapse: preserve;&quot;&gt;createS3Client()&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt; se encarga de crear el cliente S3, &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space-collapse: preserve;&quot;&gt;generateZipBytes()&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt; genera los bytes del archivo ZIP, &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space-collapse: preserve;&quot;&gt;listObjectsInS3()&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt; lista los objetos en S3, &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space-collapse: preserve;&quot;&gt;addToZip()&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt; agrega un archivo al ZIP y &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space-collapse: preserve;&quot;&gt;uploadZipToS3()&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt; sube el archivo ZIP a S3.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;import java.io.{ByteArrayInputStream, ByteArrayOutputStream}&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;import java.util.zip.{ZipEntry, ZipOutputStream}&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;import software.amazon.awssdk.auth.credentials.{DefaultCredentialsProvider, StaticCredentialsProvider}&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;import software.amazon.awssdk.regions.Region&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;import software.amazon.awssdk.services.s3.{S3Client, S3Configuration}&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;import software.amazon.awssdk.services.s3.model.{CreateBucketRequest, PutObjectRequest}&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;import scala.collection.JavaConverters._&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;import java.time.LocalDate&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;import java.time.format.DateTimeFormatter&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;trait S3ZipManager {&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;def bucketName: String&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;def s3KeyPrefix: String&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;def generateAndUploadZip(): Unit = {&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;val zipFileName = s&quot;your-prefix_${LocalDate.now().format(DateTimeFormatter.ofPattern(&quot;yyyyMMdd&quot;))}.zip&quot;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;val s3Client = createS3Client()&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;val zipFileBytes = generateZipBytes(s3Client)&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;uploadZipToS3(s3Client, zipFileName, zipFileBytes)&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;println(s&quot;ZIP file $zipFileName created and uploaded to S3.&quot;)&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;}&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;private def createS3Client(): S3Client = {&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;S3Client.builder()&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.region(Region.US_EAST_1) // Specify your desired region&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.credentialsProvider(DefaultCredentialsProvider.create())&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.serviceConfiguration(S3Configuration.builder().pathStyleAccessEnabled(true).build())&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.build()&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;}&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;private def generateZipBytes(s3Client: S3Client): Array[Byte] = {&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;val byteArrayOutputStream = new ByteArrayOutputStream()&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;val zipOutputStream = new ZipOutputStream(byteArrayOutputStream)&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;listObjectsInS3(s3Client).foreach { s3Object =&amp;gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;val s3ObjectKey = s3Object.key()&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;val s3ObjectContent = s3Client.getObject(builder =&amp;gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;builder.bucket(bucketName).key(s3ObjectKey)&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;).readAllBytes()&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;addToZip(zipOutputStream, s3ObjectKey, s3ObjectContent)&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;zipOutputStream.close()&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;byteArrayOutputStream.toByteArray&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;}&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;private def listObjectsInS3(s3Client: S3Client): Seq[software.amazon.awssdk.services.s3.model.S3Object] = {&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;val listObjectsResponse = s3Client.listObjects(builder =&amp;gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;builder.bucket(bucketName).prefix(s3KeyPrefix)&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;)&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;listObjectsResponse.contents().asScala.toSeq&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;}&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;private def addToZip(zipOutputStream: ZipOutputStream, entryName: String, content: Array[Byte]): Unit = {&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;zipOutputStream.putNextEntry(new ZipEntry(entryName))&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;zipOutputStream.write(content)&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;zipOutputStream.closeEntry()&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;}&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;private def uploadZipToS3(s3Client: S3Client, zipFileName: String, zipFileBytes: Array[Byte]): Unit = {&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;val zipFileInputStream = new ByteArrayInputStream(zipFileBytes)&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;val putObjectRequest = PutObjectRequest.builder()&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.bucket(bucketName)&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.key(zipFileName)&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.contentType(&quot;application/zip&quot;)&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.build()&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;s3Client.putObject(putObjectRequest, zipFileInputStream)&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;object S3ZipGenerator extends S3ZipManager {&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;override val bucketName: String = &quot;your-bucket-name&quot;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;override val s3KeyPrefix: String = &quot;your/s3/key/prefix/&quot;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 14px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;def main(args: Array[String]): Unit = {&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;generateAndUploadZip()&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;</description><link>http://spaceanalytics.blogspot.com/2023/06/generar-un-zip-de-objetos-s3-con-un.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-5569835032690002647</guid><pubDate>Sat, 10 Jun 2023 22:22:00 +0000</pubDate><atom:updated>2023-06-11T00:22:18.868+02:00</atom:updated><title>Procesamiento de peticiones GraphQL en Datahub</title><description>&lt;p&gt;&lt;span style=&quot;color: #343541; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;A continuación se implementa un código en Scala con 2 objetos singleton. El primero de ellos se llamará &lt;b&gt;DatahubExportRunner&lt;/b&gt; que recibe en el constructor la configuración de la aplicacion y se encarga de llamar a otro objeto singleton &lt;b&gt;DatahubGraphqlProcessor &lt;/b&gt;pasando un prefijo de clave S3 en el constructor. En función del estado obtenido en la respuesta, que debe ser una instancia de case class con el estado del procesamiento de la petición y un mapa con clave correspondiente a la clave S3 y el valor con una lista de String con el contenido a guardar para ese objeto S3, el objeto DatahubExportRunner escribe el contenido en S3 o lanza una excepción indicando que no se ha podido realizar la exportación por estado incorrecto devuelto al hacer la petición al endpoint graphql de datahub. El objeto DatahubGraphqlProcessor se encarga de hacer una petición http al api rest de Datahub usando el endpoint de graphql, procesar la respuesta y devolver una instancia indicando el resultado.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #343541; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;El método &lt;i&gt;runExport &lt;/i&gt;del objeto DatahubExportRunner recibe la configuración como parámetro y obtiene el s3KeyPrefix a partir de dicha configuración. Luego se pasa el prefijo de clave S3 al método que procesa la respuesta, ya que se usa para generar el mapa con el contenido a guardar en S3.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #343541; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, Helvetica Neue, Arial, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;&quot;&gt;&lt;span style=&quot;white-space-collapse: preserve;&quot;&gt;import scala.collection.mutable.ListBuffer
import scala.util.{Failure, Success, Try}
import scalaj.http.{Http, HttpResponse}

// Case class para representar el resultado de la petición graphql
case class DatahubGraphqlResponse(status: String, s3Data: Map[String, List[String]])

// Objeto singleton DatahubGraphqlProcessor para hacer la petición graphql y procesar la respuesta
object DatahubGraphqlProcessor {
  def processGraphqlRequest(endpoint: String): DatahubGraphqlResponse = {
    // Realizar la petición HTTP al endpoint de graphql de Datahub
    val response: HttpResponse[String] = Http(endpoint).asString

    // Procesar la respuesta y devolver una instancia de DatahubGraphqlResponse
    if (response.is2xx) {
      // Parsear la respuesta y obtener los datos de S3
      val s3Data: Map[String, List[String]] = parseResponse(response.body)

      // Crear la instancia de DatahubGraphqlResponse con el estado &quot;Success&quot; y los datos de S3
      DatahubGraphqlResponse(&quot;Success&quot;, s3Data)
    } else {
      // Devolver una instancia de DatahubGraphqlResponse con el estado &quot;Failure&quot; y un mapa vacío
      DatahubGraphqlResponse(&quot;Failure&quot;, Map.empty)
    }
  }

  private def parseResponse(responseBody: String): Map[String, List[String]] = {
    // Implementar el parsing de la respuesta y devolver los datos de S3 en un mapa
    // ...
    Map.empty[String, List[String]]
  }
}

// Objeto singleton DatahubExportRunner para ejecutar la exportación de datos
object DatahubExportRunner {
  def runExport(configuration: AppConfig): Unit = {
    // Construir el endpoint de graphql usando la configuración
    val endpoint: String = buildGraphqlEndpoint(configuration)

    // Llamar a DatahubGraphqlProcessor para obtener el resultado de la petición graphql
    val response: DatahubGraphqlResponse = DatahubGraphqlProcessor.processGraphqlRequest(endpoint)

    // Comprobar el estado de la respuesta y escribir el contenido en S3 o lanzar una excepción
    response.status match {
      case &quot;Success&quot; =&amp;gt;
        val s3KeyPrefix = configuration.s3KeyPrefix
        writeContentToS3(response.s3Data, s3KeyPrefix)
        println(&quot;Data export successful.&quot;)
      case &quot;Failure&quot; =&amp;gt;
        throw new RuntimeException(&quot;Data export failed.&quot;)
    }
  }

  private def buildGraphqlEndpoint(configuration: AppConfig): String = {
    // Implementar la construcción del endpoint de graphql usando la configuración
    // ...
    &quot;&quot;
  }

  private def writeContentToS3(s3Data: Map[String, List[String]], s3KeyPrefix: String): Unit = {
    // Implementar la lógica para escribir el contenido en S3 usando el prefijo de clave
    // ...
  }
}

// Case class para la configuración de la aplicación
case class AppConfig(apiEndpoint: String, apiKey: String, s3KeyPrefix: String /* Otros parámetros */)

// Ejemplo de uso
val configuration = AppConfig(&quot;https://api.datahub.com/graphql&quot;, &quot;API_KEY&quot;, &quot;my-bucket/data/&quot;)
DatahubExportRunner.runExport(configuration)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;color: #343541; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;</description><link>http://spaceanalytics.blogspot.com/2023/06/procesamiento-de-peticiones-graphql-en.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-1056980835588216880</guid><pubDate>Fri, 09 Jun 2023 20:51:00 +0000</pubDate><atom:updated>2023-06-09T22:51:38.567+02:00</atom:updated><title>Instanciacion de cliente S3 con SDK de AWS</title><description>&lt;p&gt;&lt;span style=&quot;background-color: #f7f7f8;&quot;&gt;Para&lt;/span&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt; crear un cliente S3 utilizando los métodos &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;create&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt; de ambas SDKs de Java, asumiendo que se ejecuta en AWS con toda la configuración y permisos ya establecidos:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt;&lt;b&gt;SDK 1 de Java:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;import com.amazonaws.services.s3.AmazonS3Client&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;val s3Client = new AmazonS3Client()
&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt;&lt;b&gt;SDK 2 de Java:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;import software.amazon.awssdk.services.s3.S3Client&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;val s3Client: S3Client = S3Client.create()
&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt;En la SDK 1 de Java, simplemente creamos una nueva instancia de &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;AmazonS3Client&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt; sin pasar ningún argumento al constructor. En este caso, el cliente S3 utilizará automáticamente las credenciales y la configuración establecidas en el entorno de ejecución de AWS.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space: pre-wrap;&quot;&gt;En la SDK 2 de Java, llamamos al método estático &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;create()&lt;/code&gt; de &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;S3Client&lt;/code&gt; para crear una instancia del cliente S3. Al igual que en la SDK 1, en este caso también se utilizarán automáticamente las credenciales y la configuración establecidas en el entorno de ejecución de AWS.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;Recuerda que en ambos casos, es importante asegurarse de que la instancia se esté ejecutando en un entorno de AWS con los permisos y configuraciones adecuados para acceder al servicio S3.&lt;/p&gt;&lt;/div&gt;</description><link>http://spaceanalytics.blogspot.com/2023/06/instanciacion-de-cliente-s3-con-sdk-de.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-1084210805284141514</guid><pubDate>Fri, 09 Jun 2023 16:06:00 +0000</pubDate><atom:updated>2023-06-09T18:06:59.023+02:00</atom:updated><title>Generador de ficheros en S3</title><description>&lt;p&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt; hemos utilizado las clases y métodos de la SDK 2 de AWS, como &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;S3Client&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt; y &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;PutObjectRequest&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt;, para crear un cliente S3 y construir la solicitud de &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;putObject&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt;. Además, hemos utilizado &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;RequestBody.fromString&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt; para convertir el contenido del fichero a un objeto de solicitud de cuerpo.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt;En este código, hemos creado un trait llamado &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;S3FileWriter&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt; que define el método &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;writeContent&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt;. Este método acepta el nombre del bucket, la clave S3 y las líneas del fichero a escribir. Dentro del método, se instancia el cliente S3 y se realiza la llamada a &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;putObject&lt;/code&gt;&lt;span style=&quot;background-color: #f7f7f8; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt; para escribir el contenido en S3.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space: pre-wrap;&quot;&gt;La clase &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;FileGenerator&lt;/code&gt; ahora extiende el trait &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;S3FileWriter&lt;/code&gt; y utiliza el método &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;writeContent&lt;/code&gt; para escribir el contenido de cada fichero en S3.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;De esta manera, el código se ha modularizado y reutilizado mediante el uso de traits en Scala.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space: pre-wrap;&quot;&gt;hemos creado un objeto singleton &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;FileLinesMap&lt;/code&gt; que encapsula la estructura del mapa mutable &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;linesMap&lt;/code&gt;. Hemos agregado un método &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;addLine&lt;/code&gt; que añade dinámicamente las líneas a medida que aparecen. El método verifica si la clave ya existe en el mapa, y si es así, actualiza la lista de líneas agregando la nueva línea. Si la clave no existe, se agrega una nueva entrada al mapa con la primera línea del fichero en el valor.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space: pre-wrap;&quot;&gt;La clase &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;FileGenerator&lt;/code&gt; ahora utiliza el objeto &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;FileLinesMap&lt;/code&gt; para agregar dinámicamente las líneas de los ficheros. Al final, se obtiene el mapa de líneas y se escribe el contenido en S3 utilizando el método &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;writeContent&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: black; color: white; font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 14px; white-space: pre;&quot;&gt;import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider
import software.amazon.awssdk.core.sync.RequestBody
import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.s3.S3Client
import software.amazon.awssdk.services.s3.model.PutObjectRequest

import java.nio.charset.StandardCharsets&lt;/span&gt;&lt;/p&gt;&lt;p&gt;import scala.collection.mutable.{Map =&amp;gt; MutableMap}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;object FileLinesMap {&lt;/p&gt;&lt;p&gt;&amp;nbsp; private val linesMap: MutableMap[String, List[String]] = MutableMap.empty&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; def addLine(s3Key: String, line: String): Unit = {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val updatedLines = linesMap.getOrElse(s3Key, Nil) :+ line&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; linesMap.put(s3Key, updatedLines)&lt;/p&gt;&lt;p&gt;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; def getLinesMap: MutableMap[String, List[String]] = linesMap&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;trait S3FileWriter {&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: black; color: white; font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 14px; white-space: pre;&quot;&gt;def writeContent(bucketName: String, s3Key: String, lines: List[String]): Unit = {
    val s3Client: S3Client = S3Client.builder()
      .region(Region.US_EAST_1)
      .credentialsProvider(DefaultCredentialsProvider.create())
      .build()

    val fileContent = lines.mkString(&quot;\n&quot;)

    val putObjectRequest = PutObjectRequest.builder()
      .bucket(bucketName)
      .key(s3Key)
      .build()

    s3Client.putObject(putObjectRequest, RequestBody.fromString(fileContent, StandardCharsets.UTF_8))
  }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;object FileGenerator extends S3FileWriter {&lt;/p&gt;&lt;p&gt;&amp;nbsp; def main(args: Array[String]): Unit = {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val bucketName = &quot;nombre-del-bucket&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val s3Keys = List(&quot;ruta/fichero1.csv&quot;, &quot;ruta/fichero2.csv&quot;, &quot;ruta/fichero3.csv&quot;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Agrega las líneas generadas al mapa dinámicamente&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; FileLinesMap.addLine(&quot;ruta/fichero1.csv&quot;, &quot;Línea 1 del fichero 1&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; FileLinesMap.addLine(&quot;ruta/fichero1.csv&quot;, &quot;Línea 2 del fichero 1&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; FileLinesMap.addLine(&quot;ruta/fichero2.csv&quot;, &quot;Línea 1 del fichero 2&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; FileLinesMap.addLine(&quot;ruta/fichero2.csv&quot;, &quot;Línea 2 del fichero 2&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; FileLinesMap.addLine(&quot;ruta/fichero2.csv&quot;, &quot;Línea 3 del fichero 2&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; FileLinesMap.addLine(&quot;ruta/fichero3.csv&quot;, &quot;Línea 1 del fichero 3&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; FileLinesMap.addLine(&quot;ruta/fichero3.csv&quot;, &quot;Línea 2 del fichero 3&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; FileLinesMap.addLine(&quot;ruta/fichero3.csv&quot;, &quot;Línea 3 del fichero 3&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; FileLinesMap.addLine(&quot;ruta/fichero3.csv&quot;, &quot;Línea 4 del fichero 3&quot;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Obtiene el mapa de líneas&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val fileLinesMap = FileLinesMap.getLinesMap&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // Escribe el contenido en Amazon S3 para cada fichero&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; fileLinesMap.foreach { case (s3Key, lines) =&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; writeContent(bucketName, s3Key, lines)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://spaceanalytics.blogspot.com/2023/06/generador-de-ficheros-en-s3.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-957976549558810223</guid><pubDate>Fri, 09 Jun 2023 12:20:00 +0000</pubDate><atom:updated>2023-06-09T14:20:54.444+02:00</atom:updated><title>Obtener todos los ficheros CSV dentro de un directorio</title><description>&lt;p&gt;&amp;nbsp;&lt;span style=&quot;background-color: black; color: white; font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 14px; white-space: pre;&quot;&gt;def getAllCsvFiles(directory: File): List[File] = {&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;background-color: black; color: white; font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace; font-size: 14px; white-space: pre;&quot;&gt;    if (directory.exists() &amp;amp;&amp;amp; directory.isDirectory) {
      val csvFiles = directory.listFiles().flatMap { file =&amp;gt;
        if (file.isFile &amp;amp;&amp;amp; file.getName.endsWith(&quot;.csv&quot;)) {
          List(file)
        } else if (file.isDirectory) {
          getAllCsvFiles(file)
        } else {
          List.empty[File]
        }
      }
      csvFiles.toList
    } else {
      List.empty[File]
    }
  }
}&lt;/span&gt;</description><link>http://spaceanalytics.blogspot.com/2023/06/obtener-todos-los-ficheros-csv-dentro.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-4364743725777132591</guid><pubDate>Thu, 08 Jun 2023 21:06:00 +0000</pubDate><atom:updated>2023-06-08T23:06:42.631+02:00</atom:updated><title>Subida recursiva de archivos CSV en un directorio local a S3</title><description>&lt;div style=&quot;text-align: left;&quot;&gt;Vamos a crear un&amp;nbsp;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; white-space: pre-wrap;&quot;&gt;trait &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-weight: 600; white-space: pre-wrap;&quot;&gt;CsvUploader&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; white-space: pre-wrap;&quot;&gt; que se encarga de la lógica de subir archivos CSV a S3 utilizando la AWS CLI. El método &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-weight: 600; white-space: pre-wrap;&quot;&gt;uploadCsvFiles&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; white-space: pre-wrap;&quot;&gt; recibe la ruta del directorio local donde se encuentran los archivos CSV, el nombre del bucket en S3 y el prefijo de ruta en S3 para los archivos. Luego, se itera sobre los archivos CSV dentro del directorio y se ejecuta el comando de subida utilizando la AWS CLI.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt;La clase &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;S3BatchUpload&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt; utiliza el trait &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;CsvUploader&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt; para subir todos los archivos CSV dentro de un directorio específico a S3. Simplemente se especifica la ruta del directorio local, el nombre del bucket en S3 y el prefijo de ruta en S3, y se llama al método &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;uploadCsvFiles&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt; para realizar la subida.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt;Para que la estructura de directorios se mantenga en el bucket de destino &lt;/span&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt;se construye la clave &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;s3Key&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt; en función de la estructura de directorios local. Se utiliza &lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;substring&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt; para obtener la parte de la ruta después del directorio base, y luego se reemplaza el separador de archivos local (&lt;/span&gt;&lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600; white-space: pre-wrap;&quot;&gt;File.separator&lt;/code&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt;) por el separador de rutas en S3 (&quot;/&quot;). De esta manera, se mantendrá la misma estructura de directorios en el bucket de destino.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; background-color: #f7f7f8; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;import java.io.File&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;import sys.process._&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px; min-height: 22px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;trait AwsCliExecutor {&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;protected def executeCommand(command: String): Int = command.!&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px; min-height: 22px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;trait CsvUploader extends AwsCliExecutor {&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;def uploadCsvFiles(directoryPath: String, bucketName: String, s3KeyPrefix: String): Unit = {&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;val directory = new File(directoryPath)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;val csvFiles = directory.listFiles(_.getName.toLowerCase.endsWith(&quot;.csv&quot;))&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px; min-height: 22px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;csvFiles.foreach { file =&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;val localFilePath = file.getAbsolutePath&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;val s3Key = s3KeyPrefix + localFilePath.substring(directoryPath.length).replace(File.separator, &quot;/&quot;)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;val uploadCommand = s&quot;aws s3 cp $localFilePath s3://$bucketName/$s3Key&quot;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;val result = executeCommand(uploadCommand)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px; min-height: 22px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;if (result == 0) {&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;println(s&quot;Archivo ${file.getName} subido exitosamente a S3 con ruta $s3Key.&quot;)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;} else {&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;println(s&quot;Ocurrió un error al subir el archivo ${file.getName} a S3.&quot;)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px; min-height: 22px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;object S3BatchUpload extends App with CsvUploader {&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;val localDirectoryPath = &quot;/path/to/your/local/directory&quot;&amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;// Ruta del directorio local con los archivos CSV&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;val bucketName = &quot;your-bucket-name&quot;&amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;// Nombre del bucket en S3&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;val s3KeyPrefix = &quot;path/to/upload&quot;&amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;// Prefijo de ruta en S3 para los archivos&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px; min-height: 22px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;&amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;uploadCsvFiles(localDirectoryPath, bucketName, s3KeyPrefix)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;-webkit-text-size-adjust: auto; font-size: 17px; font-stretch: normal; line-height: normal; margin: 0px;&quot;&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family: UICTFontTextStyleBody;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><link>http://spaceanalytics.blogspot.com/2023/06/subida-recursiva-de-archivos-csv-en-un.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-8689541128295492800</guid><pubDate>Thu, 08 Jun 2023 10:42:00 +0000</pubDate><atom:updated>2023-06-08T13:08:16.328+02:00</atom:updated><title>Generar un fichero CSV en S3 como un flujo</title><description>&lt;p&gt;Para crear un cliente S3:&lt;/p&gt;&lt;p&gt;import software.amazon.awssdk.auth.credentials.{AwsCredentialsProvider, ProfileCredentialsProvider}&lt;/p&gt;&lt;p&gt;import software.amazon.awssdk.regions.Region&lt;/p&gt;&lt;p&gt;import software.amazon.awssdk.services.s3.{S3Client, S3ClientBuilder}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;// Crear un proveedor de credenciales basado en el perfil&lt;/p&gt;&lt;p&gt;val credentialsProvider: AwsCredentialsProvider = ProfileCredentialsProvider.builder()&lt;/p&gt;&lt;p&gt;&amp;nbsp; .profileName(&quot;dev-usa&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; .build()&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;// Crear un cliente de Amazon S3 utilizando el builder&lt;/p&gt;&lt;p&gt;val s3ClientBuilder: S3ClientBuilder = S3Client.builder()&lt;/p&gt;&lt;p&gt;&amp;nbsp; .region(Region.US_EAST_1)&lt;/p&gt;&lt;p&gt;&amp;nbsp; .credentialsProvider(credentialsProvider)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;// Construir el cliente de Amazon S3&lt;/p&gt;&lt;p&gt;val s3Client: S3Client = s3ClientBuilder.build()&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;// Usar el cliente de Amazon S3 para realizar operaciones en S3&lt;/p&gt;&lt;p&gt;// ...&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Implmentar un generador CSV:&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;import java.io.PrintWriter&lt;/p&gt;&lt;p&gt;import software.amazon.awssdk.services.s3.{S3Client, S3Configuration}&lt;/p&gt;&lt;p&gt;import software.amazon.awssdk.services.s3.model.{PutObjectRequest, PutObjectResponse}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;object CsvGenerator {&lt;/p&gt;&lt;p&gt;&amp;nbsp; def main(args: Array[String]): Unit = {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val bucketName = &quot;my-s3-bucket&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val key = &quot;output.csv&quot; // Ruta del fichero de salida en S3&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val s3Client = S3Client.builder()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .region(Region.US_EAST_1) // Configura la región de tu bucket de S3&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .serviceConfiguration(S3Configuration.builder()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .pathStyleAccessEnabled(true)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .build())&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; .build()&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; val writer = new PrintWriter(new S3OutputStream(s3Client, bucketName, key))&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; try {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; // Escribir los datos en el fichero CSV&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; writer.println(&quot;Columna1,Columna2,Columna3&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; writer.println(&quot;Valor1,Valor2,Valor3&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; writer.println(&quot;Valor4,Valor5,Valor6&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; // ...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; println(&quot;Fichero CSV generado correctamente en S3.&quot;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; } catch {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; case e: Exception =&amp;gt; e.printStackTrace()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; } finally {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; writer.close()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;class S3OutputStream(s3Client: S3Client, bucketName: String, key: String) extends java.io.OutputStream {&lt;/p&gt;&lt;p&gt;&amp;nbsp; private val putObjectRequest = PutObjectRequest.builder()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .bucket(bucketName)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .key(key)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .build()&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; private val outputStream = s3Client.putObject(putObjectRequest)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; override def write(b: Int): Unit = {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; outputStream.write(b)&lt;/p&gt;&lt;p&gt;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; override def flush(): Unit = {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; outputStream.flush()&lt;/p&gt;&lt;p&gt;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; override def close(): Unit = {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; outputStream.close()&lt;/p&gt;&lt;p&gt;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://spaceanalytics.blogspot.com/2023/06/generar-un-fichero-csv-en-s3-como-un.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-1292630428860301388</guid><pubDate>Sun, 04 Jun 2023 12:05:00 +0000</pubDate><atom:updated>2023-06-04T14:05:55.167+02:00</atom:updated><title>Exportación de metadata de datahub a S3</title><description>&lt;p&gt;&lt;b&gt;Supuesto práctico&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; caret-color: rgb(52, 53, 65); color: #343541; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt;Tengo una aplicación Scala que llama a una API externa (Datahub), procesa la respuesta JSON y genera un conjunto de ficheros en local. Se puede ejecutar esta aplicación en un cluster EMR Serverless?&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Ejecución en EMR Serverless&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; white-space: pre-wrap;&quot;&gt;No es posible ejecutar directamente una aplicación Scala que procesa datos en un cluster EMR Serverless. EMR Serverless es un servicio de AWS que se utiliza para ejecutar trabajos de procesamiento de datos basados en Apache Spark en forma de consultas SQL o scripts de Spark, pero no es adecuado para ejecutar aplicaciones de Scala independientes.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space: pre-wrap;&quot;&gt;En EMR Serverless, se ejecutan consultas o trabajos Spark en un entorno administrado por AWS, sin necesidad de aprovisionar y administrar un clúster de EMR tradicional. Esto permite un procesamiento rápido y escalable de datos sin preocuparse por la infraestructura subyacente.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space: pre-wrap;&quot;&gt;Si tienes una aplicación Scala que procesa datos y genera archivos localmente, puedes ejecutarla en una instancia de EC2 en lugar de utilizar EMR Serverless. En EC2, tienes más control sobre el entorno de ejecución y puedes instalar las dependencias necesarias, configurar los recursos de hardware y ejecutar tu aplicación Scala directamente.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px; white-space: pre-wrap;&quot;&gt;Puedes utilizar una instancia de EC2 para ejecutar tu aplicación Scala y, si es necesario, interactuar con otros servicios de AWS como S3 para el almacenamiento de archivos o incluso utilizar servicios de procesamiento de datos como EMR si tu aplicación requiere un procesamiento más complejo.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;En resumen, EMR Serverless está diseñado específicamente para trabajar con consultas y trabajos Spark, no para ejecutar aplicaciones Scala independientes. Para ejecutar una aplicación Scala que genera archivos localmente, te recomendaría utilizar una instancia de EC2 en AWS.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;&lt;b&gt;Ejecutar en una instancia EC2&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 0px 0px 1.25em; white-space: pre-wrap;&quot;&gt;Si deseas ejecutar tu proceso batch en una instancia EC2 y planificar su ejecución, puedes seguir los siguientes pasos:&lt;/p&gt;&lt;ol style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; counter-reset: item 0; display: flex; flex-direction: column; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; list-style-image: initial; list-style-position: initial; margin: 1.25em 0px; padding: 0px 0px 0px 1rem; white-space: pre-wrap;&quot;&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Crear una instancia EC2: Provisiona una instancia EC2 en AWS con el sistema operativo de tu elección. Asegúrate de seleccionar una instancia con los recursos adecuados para ejecutar tu proceso, como capacidad de CPU, memoria y almacenamiento suficientes.&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Configurar la instancia EC2: Accede a la instancia EC2 y configúrala según tus necesidades. Esto puede incluir la instalación de las dependencias necesarias para tu proceso batch, como el lenguaje de programación, las bibliotecas y cualquier otra herramienta requerida.&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Desarrollar y configurar el proceso batch: Implementa tu proceso batch en la instancia EC2. Esto puede implicar la escritura de scripts o programas que llamen a la API de Datahub, procesen los datos y generen los archivos CSV. Asegúrate de que el proceso esté configurado correctamente y funcione según lo esperado.&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Programar la ejecución del proceso: Utiliza una herramienta de planificación de tareas en la instancia EC2, como cron en sistemas basados en Unix o el Programador de tareas en Windows, para programar la ejecución periódica de tu proceso. Configura la programación según tus necesidades, como la frecuencia y el horario de ejecución.&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Configurar permisos y acceso a recursos: Asegúrate de que la instancia EC2 tenga los permisos adecuados para acceder a la API de Datahub y para escribir los archivos CSV en el almacenamiento deseado. Esto puede implicar la configuración de roles de IAM y asignarlos a la instancia EC2 para otorgar los permisos necesarios.&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Monitorear y administrar la instancia EC2: Mantén un monitoreo regular de la instancia EC2 para asegurarte de que está funcionando correctamente. Puedes utilizar servicios como Amazon CloudWatch para recopilar métricas y registros de la instancia y configurar alarmas en caso de cualquier problema.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;Con estos pasos, podrás ejecutar tu proceso batch en una instancia EC2 y planificar su ejecución según tus necesidades. Ten en cuenta que en este enfoque, la responsabilidad de la administración y escalado de la instancia EC2 recae en ti, a diferencia de los servicios administrados como AWS Lambda.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;&lt;b&gt;Ejecutar mediante función Lambda&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;Para ejecutar tu proceso batch que llama a una API de Datahub, procesa los datos y genera archivos CSV en AWS, puedes considerar los siguientes pasos:&lt;/p&gt;&lt;ol style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; counter-reset: item 0; display: flex; flex-direction: column; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; list-style-image: initial; list-style-position: initial; margin: 1.25em 0px; padding: 0px 0px 0px 1rem; white-space: pre-wrap;&quot;&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Crear una función Lambda: Crea una función Lambda en AWS que contenga la lógica de tu proceso batch. Esta función será responsable de llamar a la API de Datahub, procesar los datos y generar los archivos CSV. Puedes desarrollar tu función en el lenguaje de programación de tu elección (por ejemplo, Python, Node.js, Java, etc.) y utilizar las bibliotecas necesarias para realizar las llamadas a la API y procesar los datos.&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Configurar un trigger de tiempo: Utiliza el servicio CloudWatch Events para programar la ejecución periódica de tu función Lambda. Puedes configurar una regla en CloudWatch Events para que se active en un intervalo específico, por ejemplo, cada día a una hora determinada. Cuando se active la regla, CloudWatch Events invocará automáticamente tu función Lambda.&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Configurar permisos y roles: Asegúrate de que la función Lambda tenga los permisos adecuados para acceder a la API de Datahub y para escribir los archivos CSV en el almacenamiento deseado, como Amazon S3 o Amazon EFS. Puedes crear un rol de IAM con las políticas necesarias y asignarlo a tu función Lambda.&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Almacenar archivos CSV: Decide dónde quieres almacenar los archivos CSV generados por tu proceso batch. Puedes utilizar Amazon S3 para almacenarlos de forma duradera y segura. Configura tu función Lambda para guardar los archivos CSV en el bucket de Amazon S3 correspondiente.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;Con estos pasos, tu proceso batch se ejecutará automáticamente cada día dentro de AWS. La función Lambda se activará según la programación establecida en CloudWatch Events, realizará las llamadas a la API de Datahub, procesará los datos y guardará los archivos CSV en Amazon S3. Esto te proporcionará una solución escalable, administrada y automatizada para ejecutar tu proceso batch en la nube de AWS.&lt;/p&gt;</description><link>http://spaceanalytics.blogspot.com/2023/06/exportacion-de-metadata-de-datahub-s3.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6170654049139790453.post-3670799693212168443</guid><pubDate>Sat, 27 May 2023 14:55:00 +0000</pubDate><atom:updated>2023-05-27T16:55:35.751+02:00</atom:updated><title>Migración a Java 11</title><description>&lt;p&gt;&lt;span style=&quot;-webkit-text-size-adjust: 100%; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; white-space: pre-wrap;&quot;&gt;Para migrar tu componente Scala que utiliza la librería Spark de JDK 8 a JDK 11, hay algunas modificaciones que puedes considerar. A continuación, se detallan los cambios más relevantes:&lt;/span&gt;&lt;/p&gt;&lt;ol style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; counter-reset: item 0; display: flex; flex-direction: column; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; list-style-image: initial; list-style-position: initial; margin: 1.25em 0px; padding: 0px 0px 0px 1rem; white-space: pre-wrap;&quot;&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Actualiza la versión de Scala: Asegúrate de utilizar una versión de Scala compatible con JDK 11. Puedes verificar la compatibilidad consultando la documentación de Scala. En tu archivo &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;pom.xml&lt;/code&gt; o en la configuración del proyecto, actualiza la propiedad &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;scala.version&lt;/code&gt; con la versión correspondiente.&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Actualiza la versión de Spark: Verifica que estás utilizando una versión de Spark compatible con JDK 11. En tu archivo &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;pom.xml&lt;/code&gt; o en la configuración del proyecto, actualiza las dependencias de Spark (por ejemplo, &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;spark-core&lt;/code&gt;, &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;spark-sql&lt;/code&gt;, &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;spark-avro&lt;/code&gt;) con la versión adecuada.&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Actualiza la configuración de la JDK: En IntelliJ, ve a &quot;File&quot; -&amp;gt; &quot;Project Structure&quot; -&amp;gt; &quot;Project Settings&quot; -&amp;gt; &quot;Project&quot; y selecciona la JDK 11 como el SDK del proyecto.&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Actualiza las dependencias: Verifica que todas las dependencias utilizadas en tu proyecto sean compatibles con JDK 11. Actualiza las versiones si es necesario y asegúrate de utilizar bibliotecas actualizadas y compatibles con la nueva versión de Java.&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Revisa cambios en la API de Spark: Es posible que algunas clases, métodos o configuraciones hayan cambiado en las versiones más recientes de Spark. Verifica la documentación oficial de Spark para identificar posibles cambios y ajusta tu código en consecuencia.&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Verifica el código relacionado con la gestión de recursos: En JDK 11, hay algunos cambios en la gestión de recursos, como el uso del bloque &lt;code style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-code); font-family: &amp;quot;Söhne Mono&amp;quot;, Monaco, &amp;quot;Andale Mono&amp;quot;, &amp;quot;Ubuntu Mono&amp;quot;, monospace !important; font-size: 0.875em; font-weight: 600;&quot;&gt;try-with-resources&lt;/code&gt; para asegurarte de que los recursos sean cerrados correctamente. Verifica tu código y aplica los cambios necesarios en la gestión de recursos.&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px; padding-left: 0.375em;&quot;&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; margin: 0px;&quot;&gt;Considera migrar a Java 11 en lugar de Scala: Si tu código Scala no hace un uso intensivo de características específicas de Scala y la migración a JDK 11 implica demasiados cambios, también puedes considerar migrar a Java 11. Esto puede simplificar la migración y garantizar la compatibilidad con JDK 11 de manera más directa.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;Recuerda que es importante realizar pruebas exhaustivas después de la migración para asegurarte de que tu componente Scala funcione correctamente con la nueva JDK 11.&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;Recursos adicionales&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;&lt;a href=&quot;https://www.adictosaltrabajo.com/2019/05/21/migracion-de-java-8-a-java-11/&quot;&gt;https://www.adictosaltrabajo.com/2019/05/21/migracion-de-java-8-a-java-11/&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;&lt;a href=&quot;https://docs.scala-lang.org/overviews/jdk-compatibility/overview.html#inner-main&quot;&gt;https://docs.scala-lang.org/overviews/jdk-compatibility/overview.html#inner-main&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;&lt;a href=&quot;https://medium.com/globant/migrating-to-java-11-from-java-8-bd6343107ea6&quot;&gt;https://medium.com/globant/migrating-to-java-11-from-java-8-bd6343107ea6&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,0.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; -webkit-text-size-adjust: 100%; border: 0px solid rgb(217, 217, 227); box-sizing: border-box; caret-color: rgb(55, 65, 81); color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, &amp;quot;Segoe UI&amp;quot;, Roboto, Ubuntu, Cantarell, &amp;quot;Noto Sans&amp;quot;, sans-serif, &amp;quot;Helvetica Neue&amp;quot;, Arial, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Noto Color Emoji&amp;quot;; font-size: 16px; margin: 1.25em 0px 0px; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/p&gt;</description><link>http://spaceanalytics.blogspot.com/2023/05/migracion-java-11.html</link><author>noreply@blogger.com (fglopez)</author><thr:total>0</thr:total></item></channel></rss>