{"id":30526,"date":"2024-11-26T19:13:07","date_gmt":"2024-11-26T19:13:07","guid":{"rendered":"https:\/\/building.nubank.com\/?p=30526"},"modified":"2024-11-26T19:17:22","modified_gmt":"2024-11-26T19:17:22","slug":"scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark","status":"publish","type":"post","link":"https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/","title":{"rendered":"Scala Pr\u00e1ctico: un camino para construir y gestionar consultas en Spark"},"content":{"rendered":"\n<p>En Ciencia de Datos, la gesti\u00f3n efectiva de consultas es fundamental. Sum\u00e9rgete en la estrategia de Nubank, donde se aprovecha el poder de Scala y Spark para asegurar transformaciones de datos eficientes.<\/p>\n\n\n\n<p>Descubre c\u00f3mo la intrincada arquitectura de datos de Nubank, que incluye extracci\u00f3n, transformaci\u00f3n y carga, funciona de manera fluida con Scala para mantener la consistencia y gobernanza de los datos.<\/p>\n\n\n\n<p>Esta gu\u00eda ofrece una inmersi\u00f3n profunda en los matices de la codificaci\u00f3n y ejemplos del mundo real, mostrando las enormes capacidades de Scala y Spark para manejar consultas complejas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Una breve introducci\u00f3n a la estructura de datos de Nubank<\/h2>\n\n\n\n<p>Antes de profundizar en la parte de programaci\u00f3n, es crucial entender la estructura de datos de Nubank. En resumen, nuestra arquitectura de datos se compone de tres partes est\u00e1ndar:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Extracci\u00f3n:<\/strong> Los datos se obtienen de microservicios u otras fuentes de datos, como el Instituto Brasile\u00f1o de Geograf\u00eda y Estad\u00edstica (IBGE), el Banco Central, etc. Luego, los datos se extraen diariamente y se almacenan en Amazon S3.<\/li>\n\n\n\n<li><strong>Transformaci\u00f3n y carga:<\/strong> Este proceso ocurre una vez al d\u00eda. Aqu\u00ed, gestionamos nuestras transformaciones utilizando un repositorio de consultas. Cada &#8216;bloque&#8217; en nuestra estructura de datos representa un dataset o modelo. Para darte un contexto, gestionamos m\u00e1s de 60,000 datasets con contribuciones de m\u00e1s de mil personas cada mes.<\/li>\n\n\n\n<li><strong>Disponibilidad y uso: <\/strong>Despu\u00e9s del procesamiento, los datos se cargan en un nuevo S3 y Google Cloud. Estos datos pueden ser accesados a trav\u00e9s de Databricks, BigQuery, etc., ofreciendo un entorno de datos democratizado.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">El papel de Scala y Spark<\/h2>\n\n\n\n<p>Scala y Spark entran en juego durante la etapa de transformaci\u00f3n. Con la gran cantidad de transformaciones que ocurren, es imperativo gestionar nuestras consultas de manera efectiva, asegurando la consistencia y gobernanza de los datos. Aqu\u00ed es donde Scala y Spark brillan.<\/p>\n\n\n\n<p>Profundizando en el aspecto de la codificaci\u00f3n, es importante mencionar que utilizamos Databricks, que es similar a Jupyter. Es un entorno de ejecuci\u00f3n con el formato de un cuaderno de notas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Un ejemplo pr\u00e1ctico con Scala y Spark<\/h3>\n\n\n\n<p>Vamos a demostrar una consulta simple construida utilizando una &#8216;Tabla Base&#8217;. Esta tabla consta de detalles de transacciones, como la fecha de solicitud y la informaci\u00f3n del cliente.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Filtrado de datos: <\/strong>Al igual que en SQL, el lenguaje de Spark permite filtrar datos de manera eficiente. Por ejemplo, utilizando la cl\u00e1usula &#8216;where&#8217;, se pueden filtrar las transacciones con un estado &#8216;completado&#8217;.<\/li>\n\n\n\n<li><strong>A\u00f1adir columnas:<\/strong> Podemos a\u00f1adir una columna &#8216;requestDate&#8217; a nuestros datos utilizando la funci\u00f3n &#8216;withColumn&#8217; en Spark. Esta columna deriva su informaci\u00f3n de &#8216;requestTimestamp&#8217;, convirtiendo las marcas de tiempo en un formato de fecha.<\/li>\n<\/ol>\n\n\n\n<p>Aunque el c\u00f3digo inicial consta de solo unas pocas l\u00edneas, el poder de Scala y Spark nos permite reescribir las transformaciones como cadenas basadas en funciones puras. Este enfoque estructurado ayuda a gestionar consultas complejas de manera m\u00e1s eficiente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">MetaDatos: un ingrediente esencial y aprovechando el poder de Scala<\/h2>\n\n\n\n<p>Cuando se manejan grandes cantidades de datos, los metadatos se vuelven cruciales. Estos proporcionan informaci\u00f3n sobre la consulta, su autor, la descripci\u00f3n y m\u00e1s.<\/p>\n\n\n\n<p>Aunque es posible mantener un repositorio de metadatos separado, integrar la consulta con sus metadatos es m\u00e1s eficiente, simplificando el proceso de transformaci\u00f3n y gesti\u00f3n de datos.<\/p>\n\n\n\n<p>La propuesta \u00fanica de Scala es su capacidad para combinar la programaci\u00f3n orientada a objetos con la programaci\u00f3n funcional de manera fluida.<\/p>\n\n\n\n<p>Para estructurar mejor nuestros metadatos, introducimos &#8216;Spark Query&#8217;, un Trait en Scala (similar a una interfaz en Java o una clase abstracta en otros lenguajes). Esto nos permite definir una consulta con sus metadatos asociados.<\/p>\n\n\n\n<p>Por ejemplo, una &#8216;Spark Query&#8217; puede tener:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>tableName:<\/strong> Define d\u00f3nde se almacenar\u00e1 el resultado de la consulta.<\/li>\n\n\n\n<li><strong>description:<\/strong> Ofrece una breve descripci\u00f3n del prop\u00f3sito de la consulta.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Preparando el escenario<\/h2>\n\n\n\n<p>Imagina el desaf\u00edo: tienes una consulta y necesitas integrarla en tu estructura predefinida. Esto requiere que crees un objeto para la consulta previamente definida. Para efectos de este tutorial, podemos llamarlo <strong>CompletedPixTransactions.<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Creando nuestro objeto<\/h3>\n\n\n\n<p>Para implementar un hilo en Scala, usamos la palabra clave extends. Despu\u00e9s de extender nuestro hilo, definiremos todos los elementos necesarios dentro. Dado que Scala cuenta con capacidades impresionantes de inferencia de tipos, no es necesario especificar expl\u00edcitamente el tipo para todo. Por ejemplo, si tableName es una cadena de texto, simplemente definimos nuestra cadena.<\/p>\n\n\n\n<p>Para este ejercicio, nuestro tableName se llamar\u00e1 CompletedPixMovements. Aqu\u00ed es donde residir\u00e1n nuestros datos. Para proporcionar una breve descripci\u00f3n o lo que llamar\u00edamos un ExampleDataset, consid\u00e9relo como una instant\u00e1nea de nuestro proyecto en curso. El equipo propietario (llam\u00e9moslo OwnerTeam) no necesita ser entendido en profundidad para este contexto. Nuestros datos pertenecen a Brasil, por lo que, naturalmente, todo nuestro contenido est\u00e1 en portugu\u00e9s.<\/p>\n\n\n\n<p>Despu\u00e9s de evaluar nuestra consulta, concluimos que su nivel de QualityAssurance es alto, lo que indica un concepto de negocio bien escrito y preciso. En cuanto a nuestras entradas, lo hemos mantenido simple utilizando solo una tabla: PixMovements.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Construyendo metadatos y la consulta<\/h3>\n\n\n\n<p>Ahora viene la parte crucial. \u00bfC\u00f3mo redactamos nuestra consulta? Recuperaremos nuestra consulta previamente escrita y la integraremos dentro de nuestra estructura de encapsulaci\u00f3n. Con Scala, al construir un objeto de esta manera, hay libertad para a\u00f1adir detalles suplementarios. Si se desea, se puede agregar un metadato de frecuencia para indicar la frecuencia de ejecuci\u00f3n de la consulta.<\/p>\n\n\n\n<p>Funciones \u00fanicas exclusivas de esta consulta de Spark tambi\u00e9n pueden estar anidadas dentro. Esto mejora la claridad, ya que al escribir la consulta, estas funciones pueden ser referenciadas directamente.<\/p>\n\n\n\n<p>El siguiente paso es extraer nuestros datos de entrada del dataframe, aplicar las transformaciones necesarias como antes, y evitar cualquier funci\u00f3n de visualizaci\u00f3n ya que nuestra principal preocupaci\u00f3n es la ejecuci\u00f3n de la consulta, no su visualizaci\u00f3n o mecanismo de guardado.<\/p>\n\n\n\n<p>Con una ejecuci\u00f3n exitosa, este enfoque nos ayuda a encapsular tanto nuestra consulta como sus metadatos asociados dentro de un solo objeto estandarizado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ejecuci\u00f3n y resultados<\/h3>\n\n\n\n<p>El proceso para ejecutar esta consulta encapsulada es bastante intuitivo. Primero, especifica la entrada de tu consulta, que t\u00edpicamente es un mapa, luego accede a los datos dentro de la tabla usando el nombre del mapa. Este objeto puede entonces llamar a la consulta definida e introducir los datos en ella. Si se ejecuta correctamente, deber\u00edas ver resultados similares a los de antes.<\/p>\n\n\n\n<p>Para guardar los resultados en una tabla\u2014un procedimiento est\u00e1ndar en las pipelines\u2014puedes utilizar los comandos de Spark. El nombre de la tabla est\u00e1 predefinido dentro de nuestro objeto como TableName. Al ejecutar, los resultados de la consulta ser\u00e1n almacenados en esta tabla especificada.<\/p>\n\n\n\n<p>En resumen, hemos encapsulado exitosamente una consulta b\u00e1sica y sus metadatos en un objeto estandarizado, ofreciendo un m\u00e9todo claro y robusto para gestionar consultas de Spark con Scala.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Un paso m\u00e1s all\u00e1: m\u00faltiples consultas<\/h2>\n\n\n\n<p>Los entornos de producci\u00f3n reales no lidian con una sola consulta, sino potencialmente con cientos. Manejar tal volumen requiere un enfoque m\u00e1s avanzado.<\/p>\n\n\n\n<p>En nuestro segmento inicial, aprendimos c\u00f3mo elaborar una consulta de Spark utilizando la API de Scala, enfatizando funciones puras y capas de gobernanza mejoradas. A medida que avanzamos, profundizaremos en aprovechar el poder combinado de la programaci\u00f3n orientada a objetos y el lenguaje funcional con Scala.<\/p>\n\n\n\n<p>Dentro de nuestra consulta de Spark, poseemos un atributo llamado QueryInputs. Este atributo contiene una lista que detalla las entradas para una consulta espec\u00edfica.<\/p>\n\n\n\n<p>Por ejemplo, si queremos determinar el n\u00famero de entradas para una consulta dada, podr\u00edamos hacerlo f\u00e1cilmente llamando al m\u00e9todo .size en nuestra lista.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Creando la funci\u00f3n getNumberOfInputs<\/h2>\n\n\n\n<p>Para demostrar, podemos crear una funci\u00f3n llamada getNumberOfInputs que obtenga el n\u00famero de entradas. Cuando esta funci\u00f3n se aplica a una lista de consultas, producir\u00eda una lista de enteros que representa la cantidad de entradas para cada consulta.<\/p>\n\n\n\n<p>Esta transformaci\u00f3n es posible utilizando el operador map. El operador map aplica una funci\u00f3n dada a cada elemento de una lista de entrada, creando una nueva lista que contiene los elementos devueltos por la funci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Entendiendo la operaci\u00f3n reduce:<\/h2>\n\n\n\n<p>Otra operaci\u00f3n crucial en la programaci\u00f3n funcional es reduce. El objetivo de reduce es tomar una lista de elementos y condensarla en un solo valor.<\/p>\n\n\n\n<p>Por ejemplo, dada una lista de n\u00fameros, uno podr\u00eda usar reduce para calcular el promedio o la suma de la lista. La funci\u00f3n que acepta el m\u00e9todo reduce t\u00edpicamente toma dos argumentos y retorna un solo resultado.<\/p>\n\n\n\n<p>Para visualizarlo, imagina aplicar una funci\u00f3n secuencialmente a pares de elementos en una lista, reduci\u00e9ndola gradualmente hasta obtener un \u00fanico resultado acumulado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sumando las entradas<\/h3>\n\n\n\n<p>Para poner esto en perspectiva, consideremos un escenario donde tenemos una lista de enteros que representa las entradas de consultas. Podr\u00edamos definir una funci\u00f3n, sumNumberOfInputs, que calcule la suma de dos enteros.<\/p>\n\n\n\n<p>Cuando esta funci\u00f3n se aplica sobre nuestra lista utilizando reduce, acumular\u00eda el n\u00famero total de entradas a trav\u00e9s de todas las consultas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Identificando consultas del equipo de ingenieros PIX<\/h2>\n\n\n\n<p>Para aislar las consultas creadas por el equipo de Ingenieros PIX, empleamos la operaci\u00f3n filter. Esta operaci\u00f3n procesa una lista, reteniendo solo los elementos que cumplen con una condici\u00f3n dada.<\/p>\n\n\n\n<p>En nuestro caso, definimos una funci\u00f3n, isFromTeamPixEngineers, que verifica si una consulta dada se origina de este equipo espec\u00edfico.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Aislamiento de consultas de baja calidad<\/h2>\n\n\n\n<p>De nuestra lista filtrada de consultas de los Ingenieros PIX, podr\u00edamos querer discernir cu\u00e1les de ellas son de baja calidad. Podemos introducir otra condici\u00f3n de filtrado, verificando el atributo QualityAssurance de cada consulta en busca del valor &#8216;bajo&#8217;.<\/p>\n\n\n\n<p>Un requisito com\u00fan en los entornos ETL es identificar dependencias. Supongamos que queremos identificar qu\u00e9 conjuntos de datos dependen del conjunto de datos Meetup PixMovements. Podemos crear otra funci\u00f3n de filtro para examinar nuestra lista y encontrar consultas que dependan de este conjunto de datos espec\u00edfico.<\/p>\n\n\n\n<p>Este ejercicio es fundamental, especialmente al considerar los efectos en cadena de alterar una consulta fundamental.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Desafiando las normas: exigiendo m\u00e1s de Scala<\/h2>\n\n\n\n<p>Despu\u00e9s de establecer un sistema de consultas robusto, \u00bfqu\u00e9 sigue? Aqu\u00ed hay algunas provocaciones:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Implementaci\u00f3n de pruebas rigurosas<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Garantizando alta validez:<\/strong>Por ejemplo, todos los conjuntos de datos bajo el equipo de PixEngineers deben mantener una alta validez. Solo podemos aceptar transformaciones que se adhieran a esta regla.<\/li>\n\n\n\n<li><strong>Limitando las entradas de consultas:<\/strong> Ninguna consulta deber\u00eda depender de m\u00e1s de 10 entradas. La idea es prevenir dependencias excesivamente complejas que podr\u00edan ser dif\u00edciles de depurar o mantener.<\/li>\n\n\n\n<li><strong>Evitando dependencias c\u00edclicas:<\/strong> Por ejemplo, si el conjunto de datos A depende del conjunto de datos B, y B depende de C, entonces C no deber\u00eda depender de A. Tales dependencias c\u00edclicas pueden introducir errores sutiles y problemas de rendimiento.<\/li>\n<\/ol>\n\n\n\n<p>Estas son pr\u00e1cticas que hemos integrado en nuestra gobernanza de datos en Nubank, asegurando control y consistencia.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Capacidades avanzadas de Scala<\/h3>\n\n\n\n<p>La flexibilidad de Scala ofrece posibilidades a\u00fan m\u00e1s avanzadas:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Visualizaci\u00f3n de dependencias:<\/strong> Dada una lista de todas las consultas, Scala nos permite interpretar el grafo de dependencias y visualizarlo. Cada conjunto de datos se representa como un bloque, con cadenas que muestran sus dependencias. Esta visualizaci\u00f3n puede enriquecerse con codificaci\u00f3n de colores seg\u00fan la calidad de los conjuntos de datos, lo que permite obtener r\u00e1pidamente ideas sobre posibles \u00e1reas de preocupaci\u00f3n.<\/li>\n\n\n\n<li><strong>Metadatos como datos:<\/strong> Otra capacidad intrigante es tratar los metadatos como datos reales. Al capturar los metadatos de transformaci\u00f3n, podemos crear una tabla e integrarla en nuestros procesos ETL. Estos datos pueden ser consumidos y monitoreados, ofreciendo informaci\u00f3n en tiempo real.<\/li>\n<\/ol>\n\n\n\n<p>Por ejemplo, con solo unas pocas l\u00edneas de c\u00f3digo, podemos crear un dataframe, que nos permite analizar la distribuci\u00f3n de datos, como el n\u00famero de conjuntos de datos por pa\u00eds o por equipo propietario, en tiempo real.<\/p>\n\n\n\n<p>Dominar Scala y Spark resulta fundamental para optimizar las transformaciones y la gesti\u00f3n de datos. Como ilustra la metodolog\u00eda de Nubank, integrar ambas herramientas ofrece una soluci\u00f3n integral a los desaf\u00edos de la gobernanza de datos.<\/p>\n\n\n\n<p>Con caracter\u00edsticas como la encapsulaci\u00f3n de consultas y metadatos, la visualizaci\u00f3n de dependencias y el tratamiento de metadatos como datos reales, Scala se convierte en un activo invaluable para los profesionales de datos. A medida que los ecosistemas de datos contin\u00faan creciendo y volvi\u00e9ndose m\u00e1s complejos, adoptar estas estrategias se vuelve crucial para las empresas que buscan eficiencia, claridad y una gobernanza de datos robusta.<\/p>\n\n\n\n<p>Mira lo que compartimos sobre este tema en Meetup a continuaci\u00f3n:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<span class=\"embed-youtube\" style=\"text-align:center; display: block;\"><iframe loading=\"lazy\" class=\"youtube-player\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/MO_z8yByySg?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=es-ES&#038;autohide=2&#038;wmode=transparent&#038;listType=playlist&#038;list=PLfqo9_UMdHhYKJ6LnyzNNNOYKshjvJFUA\" allowfullscreen=\"true\" style=\"border:0;\" sandbox=\"allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox\"><\/iframe><\/span>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Descubre el enfoque de Nubank para la transformaci\u00f3n y gobernanza de datos usando Scala y Spark.<\/p>\n","protected":false},"author":178110103,"featured_media":30523,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[2608,2509],"tags":[2738,2611],"ppma_author":[2321],"class_list":["post-30526","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics-engineering-es","category-data-analytics-es","tag-analytics-engineer-es","tag-data-analytics-es"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Scala Pr\u00e1ctico: un camino para construir y gestionar consultas en Spark - Building Nubank<\/title>\n<meta name=\"description\" content=\"Descubre el enfoque de Nubank para la transformaci\u00f3n y gobernanza de datos usando Scala y Spark.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Scala Pr\u00e1ctico: un camino para construir y gestionar consultas en Spark - Building Nubank\" \/>\n<meta property=\"og:description\" content=\"Descubre el enfoque de Nubank para la transformaci\u00f3n y gobernanza de datos usando Scala y Spark.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/\" \/>\n<meta property=\"og:site_name\" content=\"Building Nubank\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-26T19:13:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-26T19:17:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-28-at-13.54.42.png?fit=1190%2C789&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1190\" \/>\n\t<meta property=\"og:image:height\" content=\"789\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Nubank Editorial\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nubank Editorial\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\\\/\"},\"author\":{\"name\":\"Nubank Editorial\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/#\\\/schema\\\/person\\\/462f4f5a8d4ec3ccbc3d661dde00f0a4\"},\"headline\":\"Scala Pr\u00e1ctico: un camino para construir y gestionar consultas en Spark\",\"datePublished\":\"2024-11-26T19:13:07+00:00\",\"dateModified\":\"2024-11-26T19:17:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\\\/\"},\"wordCount\":2197,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/building.nubank.com\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/Screenshot-2024-10-28-at-13.54.42.png?fit=1190%2C789&ssl=1\",\"keywords\":[\"Analytics Engineer\",\"data analytics\"],\"articleSection\":[\"Analytics Engineering\",\"Data &amp; Analytics\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/building.nubank.com\\\/es\\\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\\\/\",\"url\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\\\/\",\"name\":\"Scala Pr\u00e1ctico: un camino para construir y gestionar consultas en Spark - Building Nubank\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/building.nubank.com\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/Screenshot-2024-10-28-at-13.54.42.png?fit=1190%2C789&ssl=1\",\"datePublished\":\"2024-11-26T19:13:07+00:00\",\"dateModified\":\"2024-11-26T19:17:22+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/#\\\/schema\\\/person\\\/462f4f5a8d4ec3ccbc3d661dde00f0a4\"},\"description\":\"Descubre el enfoque de Nubank para la transformaci\u00f3n y gobernanza de datos usando Scala y Spark.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/building.nubank.com\\\/es\\\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/building.nubank.com\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/Screenshot-2024-10-28-at-13.54.42.png?fit=1190%2C789&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/building.nubank.com\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/Screenshot-2024-10-28-at-13.54.42.png?fit=1190%2C789&ssl=1\",\"width\":1190,\"height\":789,\"caption\":\"Nubanker working at our office\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Scala Pr\u00e1ctico: un camino para construir y gestionar consultas en Spark\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/\",\"name\":\"Building Nubank\",\"description\":\"We make the extraordinary happen\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/#\\\/schema\\\/person\\\/462f4f5a8d4ec3ccbc3d661dde00f0a4\",\"name\":\"Nubank Editorial\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g0a78bc815f2126d9ba65b2af185671f1\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g\",\"caption\":\"Nubank Editorial\"},\"url\":\"https:\\\/\\\/building.nubank.com\\\/es\\\/author\\\/editorial\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Scala Pr\u00e1ctico: un camino para construir y gestionar consultas en Spark - Building Nubank","description":"Descubre el enfoque de Nubank para la transformaci\u00f3n y gobernanza de datos usando Scala y Spark.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/","og_locale":"es_ES","og_type":"article","og_title":"Scala Pr\u00e1ctico: un camino para construir y gestionar consultas en Spark - Building Nubank","og_description":"Descubre el enfoque de Nubank para la transformaci\u00f3n y gobernanza de datos usando Scala y Spark.","og_url":"https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/","og_site_name":"Building Nubank","article_published_time":"2024-11-26T19:13:07+00:00","article_modified_time":"2024-11-26T19:17:22+00:00","og_image":[{"width":1190,"height":789,"url":"https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-28-at-13.54.42.png?fit=1190%2C789&ssl=1","type":"image\/png"}],"author":"Nubank Editorial","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Nubank Editorial","Tiempo de lectura":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/#article","isPartOf":{"@id":"https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/"},"author":{"name":"Nubank Editorial","@id":"https:\/\/building.nubank.com\/es\/#\/schema\/person\/462f4f5a8d4ec3ccbc3d661dde00f0a4"},"headline":"Scala Pr\u00e1ctico: un camino para construir y gestionar consultas en Spark","datePublished":"2024-11-26T19:13:07+00:00","dateModified":"2024-11-26T19:17:22+00:00","mainEntityOfPage":{"@id":"https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/"},"wordCount":2197,"commentCount":0,"image":{"@id":"https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-28-at-13.54.42.png?fit=1190%2C789&ssl=1","keywords":["Analytics Engineer","data analytics"],"articleSection":["Analytics Engineering","Data &amp; Analytics"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/","url":"https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/","name":"Scala Pr\u00e1ctico: un camino para construir y gestionar consultas en Spark - Building Nubank","isPartOf":{"@id":"https:\/\/building.nubank.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/#primaryimage"},"image":{"@id":"https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-28-at-13.54.42.png?fit=1190%2C789&ssl=1","datePublished":"2024-11-26T19:13:07+00:00","dateModified":"2024-11-26T19:17:22+00:00","author":{"@id":"https:\/\/building.nubank.com\/es\/#\/schema\/person\/462f4f5a8d4ec3ccbc3d661dde00f0a4"},"description":"Descubre el enfoque de Nubank para la transformaci\u00f3n y gobernanza de datos usando Scala y Spark.","breadcrumb":{"@id":"https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/#primaryimage","url":"https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-28-at-13.54.42.png?fit=1190%2C789&ssl=1","contentUrl":"https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-28-at-13.54.42.png?fit=1190%2C789&ssl=1","width":1190,"height":789,"caption":"Nubanker working at our office"},{"@type":"BreadcrumbList","@id":"https:\/\/building.nubank.com\/es\/scala-practico-un-camino-para-construir-y-gestionar-consultas-en-spark\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/building.nubank.com\/es\/"},{"@type":"ListItem","position":2,"name":"Scala Pr\u00e1ctico: un camino para construir y gestionar consultas en Spark"}]},{"@type":"WebSite","@id":"https:\/\/building.nubank.com\/es\/#website","url":"https:\/\/building.nubank.com\/es\/","name":"Building Nubank","description":"We make the extraordinary happen","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/building.nubank.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/building.nubank.com\/es\/#\/schema\/person\/462f4f5a8d4ec3ccbc3d661dde00f0a4","name":"Nubank Editorial","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g0a78bc815f2126d9ba65b2af185671f1","url":"https:\/\/secure.gravatar.com\/avatar\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g","caption":"Nubank Editorial"},"url":"https:\/\/building.nubank.com\/es\/author\/editorial\/"}]}},"jetpack_featured_media_url":"https:\/\/i0.wp.com\/building.nubank.com\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-28-at-13.54.42.png?fit=1190%2C789&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pbKBB5-7Wm","jetpack_sharing_enabled":true,"authors":[{"term_id":2321,"user_id":178110103,"is_guest":0,"slug":"editorial","display_name":"Nubank Editorial","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/posts\/30526","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/users\/178110103"}],"replies":[{"embeddable":true,"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/comments?post=30526"}],"version-history":[{"count":4,"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/posts\/30526\/revisions"}],"predecessor-version":[{"id":30840,"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/posts\/30526\/revisions\/30840"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/media\/30523"}],"wp:attachment":[{"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/media?parent=30526"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/categories?post=30526"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/tags?post=30526"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/building.nubank.com\/es\/wp-json\/wp\/v2\/ppma_author?post=30526"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}