{"id":30528,"date":"2024-11-26T19:13:07","date_gmt":"2024-11-26T19:13:07","guid":{"rendered":"https:\/\/building.nubank.com\/?p=30528"},"modified":"2024-11-26T19:16:54","modified_gmt":"2024-11-26T19:16:54","slug":"scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark","status":"publish","type":"post","link":"https:\/\/building.nubank.com\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\/","title":{"rendered":"Scala na Pr\u00e1tica: um caminho para construir e gerenciar consultas no Spark"},"content":{"rendered":"\n<p>Na ci\u00eancia de dados, o gerenciamento eficaz de consultas \u00e9 fundamental. Mergulhe na estrat\u00e9gia do Nubank, onde o poder de Scala e Spark \u00e9 aproveitado para garantir transforma\u00e7\u00f5es de dados eficientes.<\/p>\n\n\n\n<p>Descubra como a complexa arquitetura de dados do Nubank, que inclui extra\u00e7\u00e3o, transforma\u00e7\u00e3o e carregamento, trabalha perfeitamente com Scala para manter a consist\u00eancia e governan\u00e7a dos dados.<\/p>\n\n\n\n<p>Este guia oferece uma imers\u00e3o nas nuances da codifica\u00e7\u00e3o e exemplos do mundo real, demonstrando as imensas capacidades de Scala e Spark no manejo de consultas complexas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Uma breve introdu\u00e7\u00e3o \u00e0 estrutura de dados do Nubank&nbsp;<\/h2>\n\n\n\n<p>Antes de mergulharmos na parte de programa\u00e7\u00e3o, \u00e9 crucial entender a estrutura de dados do Nubank. Em resumo, nossa arquitetura de dados \u00e9 composta por tr\u00eas partes principais:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Extra\u00e7\u00e3o: <\/strong>Os dados s\u00e3o obtidos de microsservi\u00e7os ou outras fontes, como o Instituto Brasileiro de Geografia e Estat\u00edstica (IBGE), Banco Central, etc. Esses dados s\u00e3o extra\u00eddos diariamente e armazenados na Amazon S3.<\/li>\n\n\n\n<li><strong>Transforma\u00e7\u00e3o e carregamento:<\/strong> Esse processo ocorre uma vez por dia. Aqui, gerenciamos nossas transforma\u00e7\u00f5es usando um reposit\u00f3rio de consultas. Cada &#8216;bloco&#8217; em nossa estrutura de dados representa um conjunto de dados ou modelo. Para contextualizar, gerenciamos mais de 60.000 conjuntos de dados com contribui\u00e7\u00f5es de mais de mil pessoas todos os meses.<\/li>\n\n\n\n<li><strong>Disponibilidade e uso:<\/strong> Ap\u00f3s o processamento, os dados s\u00e3o carregados em uma nova S3 e no Google Cloud. Esses dados podem ser acessados atrav\u00e9s do Databricks, BigQuery, etc., oferecendo um ambiente de dados democratizado.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">O papel do Scala e Spark<\/h2>\n\n\n\n<p>Scala e Spark entram em cena durante a etapa de transforma\u00e7\u00e3o. Com a grande quantidade de transforma\u00e7\u00f5es ocorrendo, \u00e9 essencial gerenciar nossas consultas de maneira eficaz, garantindo a consist\u00eancia e governan\u00e7a dos dados. \u00c9 aqui que Scala e Spark realmente se destacam.<\/p>\n\n\n\n<p>Entrando na parte de codifica\u00e7\u00e3o, \u00e9 importante mencionar que utilizamos o Databricks, que \u00e9 semelhante ao Jupyter. Este \u00e9 um ambiente de execu\u00e7\u00e3o no estilo de um notebook.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Um exemplo pr\u00e1tico com Scala e Spark<\/h3>\n\n\n\n<p>&nbsp;Vamos demonstrar uma consulta simples constru\u00edda usando uma &#8216;Tabela Base&#8217;. Esta tabela consiste em detalhes de transa\u00e7\u00f5es, como a data da solicita\u00e7\u00e3o e informa\u00e7\u00f5es do cliente.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Filtrando dados: <\/strong>Assim como no SQL, a linguagem do Spark permite filtrar dados de maneira eficiente. Por exemplo, usando a cl\u00e1usula &#8216;where&#8217;, \u00e9 poss\u00edvel filtrar as transa\u00e7\u00f5es com status &#8216;conclu\u00eddo&#8217;.<\/li>\n\n\n\n<li><strong>Adicionando colunas:<\/strong>Podemos adicionar uma coluna &#8216;dataSolicitacao&#8217; aos nossos dados usando a fun\u00e7\u00e3o &#8216;withColumn&#8217; no Spark. Essa coluna deriva dados de &#8216;timestampSolicitacao&#8217;, convertendo os timestamps em um formato de data.<\/li>\n<\/ol>\n\n\n\n<p>Embora o c\u00f3digo inicial consista em apenas algumas linhas, o poder do Scala e Spark nos permite reescrever as transforma\u00e7\u00f5es como cadeias baseadas em fun\u00e7\u00f5es puras. Essa abordagem estruturada ajuda a gerenciar consultas complexas de maneira mais eficiente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Metadados: um ingrediente essencial e aproveitando o poder do Scala<\/h2>\n\n\n\n<p>Ao lidar com grandes volumes de dados, os metadados se tornam cruciais. Eles fornecem informa\u00e7\u00f5es sobre a consulta, seu autor, a descri\u00e7\u00e3o e muito mais.<\/p>\n\n\n\n<p>Embora seja poss\u00edvel manter um reposit\u00f3rio de metadados separado, integrar a consulta com seus metadados \u00e9 mais eficiente, simplificando o processo de transforma\u00e7\u00e3o e gerenciamento de dados.<\/p>\n\n\n\n<p>A grande vantagem do Scala \u00e9 sua capacidade de combinar programa\u00e7\u00e3o orientada a objetos com programa\u00e7\u00e3o funcional de forma fluida.<\/p>\n\n\n\n<p>Para estruturar melhor nossos metadados, introduzimos o &#8216;Spark Query&#8217;\u2014um Trait em Scala (semelhante a uma interface no Java ou uma classe abstrata em outras linguagens). Isso nos permite definir uma consulta com seus metadados associados.<\/p>\n\n\n\n<p>Por exemplo, um &#8216;Spark Query&#8217; pode ter:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>tableName:<\/strong>Define onde o resultado da consulta ser\u00e1 armazenado.<\/li>\n\n\n\n<li><strong>description:<\/strong> Fornece um breve resumo sobre o prop\u00f3sito da consulta.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Preparando o terreno<\/h2>\n\n\n\n<p>Imagine o desafio: voc\u00ea tem uma consulta e precisa encaix\u00e1-la na sua estrutura predefinida. Isso exige a cria\u00e7\u00e3o de um objeto para a consulta definida previamente. Para fins deste tutorial, podemos nome\u00e1-lo de <strong>CompletedPixTransactions<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Criando nosso objeto<\/h3>\n\n\n\n<p>&nbsp;Para implementar um trait em Scala, usamos a palavra-chave extends. Ap\u00f3s estender nosso trait, definimos todos os elementos necess\u00e1rios dentro dele. Como o Scala possui capacidades impressionantes de infer\u00eancia de tipos, n\u00e3o \u00e9 necess\u00e1rio especificar o tipo explicitamente para tudo. Por exemplo, se tableName \u00e9 uma string, basta definir nossa string.<\/p>\n\n\n\n<p>Para este exerc\u00edcio, nosso tableName ser\u00e1 nomeado CompletedPixMovements. \u00c9 aqui que nossos dados ser\u00e3o armazenados. Para fornecer uma breve descri\u00e7\u00e3o, ou o que chamar\u00edamos de ExampleDataset, considere-o como um instant\u00e2neo do nosso projeto em andamento. A equipe propriet\u00e1ria (vamos cham\u00e1-la de OwnerTeam) n\u00e3o precisa ser compreendida em profundidade para este contexto. Nossos dados dizem respeito ao Brasil, ent\u00e3o, naturalmente, todo o nosso conte\u00fado est\u00e1 em portugu\u00eas.<\/p>\n\n\n\n<p>Ap\u00f3s avaliar nossa consulta, conclu\u00edmos que seu n\u00edvel de QualityAssurance \u00e9 alto, indicando um conceito de neg\u00f3cio bem escrito e preciso. Quanto aos nossos inputs, mantivemos tudo simples, usando apenas uma tabela: PixMovements.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Construindo metadados e a consulta<\/h3>\n\n\n\n<p>Agora vem a parte crucial. Como redigir nossa consulta? Vamos recuperar nossa consulta escrita anteriormente e incorpor\u00e1-la dentro da nossa estrutura de encapsulamento. Com Scala, ao construir um objeto dessa maneira, temos a liberdade de adicionar detalhes adicionais. Se desejado, podemos acrescentar metadados de frequ\u00eancia para indicar a frequ\u00eancia de execu\u00e7\u00e3o da consulta.<\/p>\n\n\n\n<p>Fun\u00e7\u00f5es exclusivas para essa consulta do Spark tamb\u00e9m podem ser aninhadas dentro dela. Isso melhora a clareza, pois quando a consulta \u00e9 escrita, essas fun\u00e7\u00f5es podem ser referenciadas diretamente.<\/p>\n\n\n\n<p>O pr\u00f3ximo passo \u00e9 extrair nossos dados de entrada do dataframe, aplicar as transforma\u00e7\u00f5es necess\u00e1rias como antes, e evitar quaisquer fun\u00e7\u00f5es de exibi\u00e7\u00e3o, j\u00e1 que nossa principal preocupa\u00e7\u00e3o \u00e9 a execu\u00e7\u00e3o da consulta, e n\u00e3o seu mecanismo de exibi\u00e7\u00e3o ou salvamento.<\/p>\n\n\n\n<p>Com a execu\u00e7\u00e3o bem-sucedida, essa abordagem nos ajuda a encapsular tanto nossa consulta quanto seus metadados associados dentro de um \u00fanico objeto padronizado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Execu\u00e7\u00e3o e resultados<\/h3>\n\n\n\n<p>O processo para executar essa consulta encapsulada \u00e9 bastante intuitivo. Primeiro, especifique a entrada da sua consulta, que normalmente \u00e9 um mapa (map). Em seguida, acesse os dados dentro da tabela usando o nome desse mapa. Esse objeto pode ent\u00e3o chamar a consulta definida e inserir dados nela. Se executada corretamente, voc\u00ea deve ver resultados semelhantes aos anteriores.<\/p>\n\n\n\n<p>Para salvar os resultados em uma tabela\u2014um procedimento padr\u00e3o em pipelines\u2014voc\u00ea pode utilizar os comandos do Spark. O nome da tabela est\u00e1 predefinido dentro do nosso objeto como TableName. Ao executar, os resultados da consulta ser\u00e3o armazenados nessa tabela especificada.<\/p>\n\n\n\n<p>Em resumo, encapsulamos com sucesso uma consulta b\u00e1sica e seus metadados em um objeto padronizado, oferecendo um m\u00e9todo claro e robusto para gerenciar consultas Spark com Scala.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Um passo al\u00e9m: m\u00faltiplas consultas<\/h2>\n\n\n\n<p>Ambientes de produ\u00e7\u00e3o do mundo real lidam n\u00e3o apenas com uma consulta, mas potencialmente com centenas. Gerenciar volumes desse tipo exige uma abordagem mais avan\u00e7ada.<\/p>\n\n\n\n<p>No nosso segmento inicial, aprendemos como criar uma consulta Spark usando a API do Scala, com \u00eanfase em fun\u00e7\u00f5es puras e camadas de governan\u00e7a aprimoradas. \u00c0 medida que avan\u00e7amos, vamos explorar como aproveitar o poder combinado da programa\u00e7\u00e3o orientada a objetos e da linguagem funcional com Scala.<\/p>\n\n\n\n<p>Dentro da nossa Spark Query, possu\u00edmos um atributo chamado QueryInputs. Esse atributo cont\u00e9m uma lista detalhando as entradas para uma consulta espec\u00edfica.<\/p>\n\n\n\n<p>Por exemplo, se quisermos determinar o n\u00famero de entradas para uma dada consulta, podemos facilmente fazer isso chamando o m\u00e9todo .size na nossa lista.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Criando a fun\u00e7\u00e3o getNumberOfInputs&nbsp;<\/h2>\n\n\n\n<p>Para demonstrar, podemos criar uma fun\u00e7\u00e3o chamada getNumberOfInputs que busca o n\u00famero de entradas. Quando essa fun\u00e7\u00e3o \u00e9 aplicada a uma lista de consultas, ela retorna uma lista de inteiros, representando o n\u00famero de entradas para cada consulta.<\/p>\n\n\n\n<p>Essa transforma\u00e7\u00e3o \u00e9 poss\u00edvel usando o operador map. O operador map aplica uma fun\u00e7\u00e3o dada a cada item de uma lista de entrada, criando uma nova lista que cont\u00e9m os itens retornados pela fun\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Entendendo a opera\u00e7\u00e3o de reduce:<\/h2>\n\n\n\n<p>Outra opera\u00e7\u00e3o crucial na programa\u00e7\u00e3o funcional \u00e9 o reduce. O objetivo do reduce \u00e9 pegar uma lista de elementos e condens\u00e1-la em um \u00fanico valor.<\/p>\n\n\n\n<p>Por exemplo, dada uma lista de n\u00fameros, pode-se usar o reduce para calcular a m\u00e9dia ou a soma dessa lista. A fun\u00e7\u00e3o aceita pelo m\u00e9todo reduce normalmente recebe dois argumentos e retorna um \u00fanico resultado.<\/p>\n\n\n\n<p>Para visualizar, imagine aplicar uma fun\u00e7\u00e3o sequencialmente a pares de elementos em uma lista, reduzindo gradualmente at\u00e9 obter um \u00fanico resultado acumulado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Somando as entradas<\/h3>\n\n\n\n<p>Para ilustrar, considere um cen\u00e1rio onde temos uma lista de inteiros representando entradas de consultas. Podemos definir uma fun\u00e7\u00e3o chamada sumNumberOfInputs, que calcula a soma de dois inteiros.<\/p>\n\n\n\n<p>Quando aplicada \u00e0 nossa lista usando o reduce, essa fun\u00e7\u00e3o acumularia o total de entradas em todas as consultas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Identificando consultas da equipe de engenheiros do PIX<\/h2>\n\n\n\n<p>Para isolar as consultas feitas pela equipe de engenheiros do PIX, utilizamos a opera\u00e7\u00e3o de filtragem. Essa opera\u00e7\u00e3o processa uma lista, retendo apenas os elementos que correspondem a uma determinada condi\u00e7\u00e3o.<\/p>\n\n\n\n<p>Para o nosso caso, definimos uma fun\u00e7\u00e3o chamada isFromTeamPixEngineers, que verifica se uma determinada consulta \u00e9 origin\u00e1ria dessa equipe espec\u00edfica.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Isolando consultas de baixa qualidade<\/h2>\n\n\n\n<p>A partir da nossa lista filtrada de consultas dos engenheiros do PIX, podemos querer identificar quais delas s\u00e3o de baixa qualidade. Podemos introduzir outra condi\u00e7\u00e3o de filtragem, verificando o atributo QualityAssurance de cada consulta e comparando com o valor &#8216;low&#8217;.<\/p>\n\n\n\n<p>Uma exig\u00eancia comum em ambientes ETL \u00e9 identificar depend\u00eancias. Suponha que queremos determinar quais conjuntos de dados dependem do dataset Meetup PixMovements. Podemos criar outra fun\u00e7\u00e3o de filtro para examinar nossa lista e encontrar consultas que dependem desse dataset espec\u00edfico.<\/p>\n\n\n\n<p>Esse exerc\u00edcio \u00e9 crucial, especialmente ao considerar os efeitos em cadeia de alterar uma consulta fundamental.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Desafiando as normas: exigindo mais do Scala&nbsp;<\/h2>\n\n\n\n<p>Depois de estabelecer um sistema robusto de consultas, o que vem a seguir? Aqui est\u00e3o algumas provoca\u00e7\u00f5es:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Implementando testes rigorosos<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Garantindo alta validade:<\/strong> Por exemplo, todos os conjuntos de dados da equipe PixEngineers devem manter alta validade. Assim, podemos aceitar apenas transforma\u00e7\u00f5es que cumpram essa regra.<\/li>\n\n\n\n<li><strong>Limitando entradas de consulta: <\/strong>Nenhuma consulta deve depender de mais de 10 entradas. A ideia \u00e9 evitar depend\u00eancias excessivamente complexas que poderiam ser dif\u00edceis de depurar ou manter.<\/li>\n\n\n\n<li><strong>Evitando depend\u00eancias c\u00edclicas:<\/strong> Por exemplo, se o conjunto de dados A depende do conjunto de dados B, e o B depende do C, ent\u00e3o o C n\u00e3o deve depender do A. Depend\u00eancias c\u00edclicas podem introduzir bugs sutis e problemas de desempenho.<\/li>\n<\/ol>\n\n\n\n<p>Essas s\u00e3o pr\u00e1ticas que incorporamos na nossa governan\u00e7a de dados no Nubank, garantindo controle e consist\u00eancia.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Capacidades avan\u00e7adas do Scala<\/h3>\n\n\n\n<p>A flexibilidade do Scala oferece possibilidades ainda mais avan\u00e7adas:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Visualiza\u00e7\u00e3o de depend\u00eancias:<\/strong> Dada uma lista de todas as consultas, o Scala nos permite interpretar o grafo de depend\u00eancias e visualiz\u00e1-lo. Cada conjunto de dados \u00e9 representado como um bloco, com cadeias mostrando suas depend\u00eancias. Essa visualiza\u00e7\u00e3o pode ser enriquecida por meio de cores, codificando os conjuntos de dados com base na sua qualidade, permitindo insights r\u00e1pidos sobre poss\u00edveis \u00e1reas de preocupa\u00e7\u00e3o.<\/li>\n\n\n\n<li><strong>Metadados como dados:<\/strong> Outra capacidade interessante envolve tratar metadados como dados reais. Ao capturar os metadados de transforma\u00e7\u00f5es, podemos criar uma tabela e integr\u00e1-la nos nossos processos ETL. Esses dados podem ent\u00e3o ser consumidos e monitorados, oferecendo insights em tempo real.<\/li>\n<\/ol>\n\n\n\n<p>Por exemplo, com apenas algumas linhas de c\u00f3digo, podemos criar um dataframe, que nos permite analisar a distribui\u00e7\u00e3o dos dados, como o n\u00famero de conjuntos de dados por pa\u00eds ou equipe respons\u00e1vel, em tempo real.<\/p>\n\n\n\n<p>Dominar Scala e Spark \u00e9 crucial para otimizar as transforma\u00e7\u00f5es e o gerenciamento de dados. Conforme ilustrado pela metodologia do Nubank, a integra\u00e7\u00e3o de ambas as ferramentas oferece uma solu\u00e7\u00e3o abrangente para os desafios da governan\u00e7a de dados.<\/p>\n\n\n\n<p>Com recursos como encapsular consultas e metadados, visualizar depend\u00eancias e tratar metadados como dados reais, o Scala se revela um ativo inestim\u00e1vel para os profissionais de dados. \u00c0 medida que os ecossistemas de dados continuam a crescer e se tornar mais complexos, adotar tais estrat\u00e9gias se torna essencial para empresas que buscam efici\u00eancia, clareza e uma governan\u00e7a de dados robusta.<\/p>\n\n\n\n<p>Confira o que compartilhamos sobre esse tema no Meetup a seguir:<\/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=pt-BR&#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>Descubra a abordagem do Nubank para transforma\u00e7\u00e3o e governan\u00e7a de dados usando Scala e Spark.<\/p>\n","protected":false},"author":178110103,"featured_media":30522,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":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":"","jetpack_post_was_ever_published":false},"categories":[2604,2503],"tags":[2733,2607],"ppma_author":[2321],"class_list":["post-30528","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics-engineering-pt-br","category-data-analytics","tag-analytics-engineer-pt-br","tag-data-analytics-pt-br"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Scala na Pr\u00e1tica: um caminho para construir e gerenciar consultas no Spark - Building Nubank<\/title>\n<meta name=\"description\" content=\"Descubra a abordagem do Nubank para transforma\u00e7\u00e3o e governan\u00e7a de dados usando Scala e 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\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Scala na Pr\u00e1tica: um caminho para construir e gerenciar consultas no Spark - Building Nubank\" \/>\n<meta property=\"og:description\" content=\"Descubra a abordagem do Nubank para transforma\u00e7\u00e3o e governan\u00e7a de dados usando Scala e Spark.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/building.nubank.com\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-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:16:54+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=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\\\/\"},\"author\":{\"name\":\"Nubank Editorial\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/#\\\/schema\\\/person\\\/462f4f5a8d4ec3ccbc3d661dde00f0a4\"},\"headline\":\"Scala na Pr\u00e1tica: um caminho para construir e gerenciar consultas no Spark\",\"datePublished\":\"2024-11-26T19:13:07+00:00\",\"dateModified\":\"2024-11-26T19:16:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\\\/\"},\"wordCount\":2143,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-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\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\\\/\",\"url\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\\\/\",\"name\":\"Scala na Pr\u00e1tica: um caminho para construir e gerenciar consultas no Spark - Building Nubank\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-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:16:54+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/#\\\/schema\\\/person\\\/462f4f5a8d4ec3ccbc3d661dde00f0a4\"},\"description\":\"Descubra a abordagem do Nubank para transforma\u00e7\u00e3o e governan\u00e7a de dados usando Scala e Spark.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-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\\\/pt-br\\\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Scala na Pr\u00e1tica: um caminho para construir e gerenciar consultas no Spark\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/#website\",\"url\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/\",\"name\":\"Building Nubank\",\"description\":\"We make the extraordinary happen\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/building.nubank.com\\\/pt-br\\\/#\\\/schema\\\/person\\\/462f4f5a8d4ec3ccbc3d661dde00f0a4\",\"name\":\"Nubank Editorial\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\\\/pt-br\\\/author\\\/editorial\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Scala na Pr\u00e1tica: um caminho para construir e gerenciar consultas no Spark - Building Nubank","description":"Descubra a abordagem do Nubank para transforma\u00e7\u00e3o e governan\u00e7a de dados usando Scala e 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\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\/","og_locale":"pt_BR","og_type":"article","og_title":"Scala na Pr\u00e1tica: um caminho para construir e gerenciar consultas no Spark - Building Nubank","og_description":"Descubra a abordagem do Nubank para transforma\u00e7\u00e3o e governan\u00e7a de dados usando Scala e Spark.","og_url":"https:\/\/building.nubank.com\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\/","og_site_name":"Building Nubank","article_published_time":"2024-11-26T19:13:07+00:00","article_modified_time":"2024-11-26T19:16:54+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","Est. tempo de leitura":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/building.nubank.com\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\/#article","isPartOf":{"@id":"https:\/\/building.nubank.com\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\/"},"author":{"name":"Nubank Editorial","@id":"https:\/\/building.nubank.com\/pt-br\/#\/schema\/person\/462f4f5a8d4ec3ccbc3d661dde00f0a4"},"headline":"Scala na Pr\u00e1tica: um caminho para construir e gerenciar consultas no Spark","datePublished":"2024-11-26T19:13:07+00:00","dateModified":"2024-11-26T19:16:54+00:00","mainEntityOfPage":{"@id":"https:\/\/building.nubank.com\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\/"},"wordCount":2143,"commentCount":0,"image":{"@id":"https:\/\/building.nubank.com\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-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":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/building.nubank.com\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/building.nubank.com\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\/","url":"https:\/\/building.nubank.com\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\/","name":"Scala na Pr\u00e1tica: um caminho para construir e gerenciar consultas no Spark - Building Nubank","isPartOf":{"@id":"https:\/\/building.nubank.com\/pt-br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/building.nubank.com\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\/#primaryimage"},"image":{"@id":"https:\/\/building.nubank.com\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-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:16:54+00:00","author":{"@id":"https:\/\/building.nubank.com\/pt-br\/#\/schema\/person\/462f4f5a8d4ec3ccbc3d661dde00f0a4"},"description":"Descubra a abordagem do Nubank para transforma\u00e7\u00e3o e governan\u00e7a de dados usando Scala e Spark.","breadcrumb":{"@id":"https:\/\/building.nubank.com\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/building.nubank.com\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/building.nubank.com\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-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\/pt-br\/scala-na-pratica-um-caminho-para-construir-e-gerenciar-consultas-no-spark\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/building.nubank.com\/pt-br\/"},{"@type":"ListItem","position":2,"name":"Scala na Pr\u00e1tica: um caminho para construir e gerenciar consultas no Spark"}]},{"@type":"WebSite","@id":"https:\/\/building.nubank.com\/pt-br\/#website","url":"https:\/\/building.nubank.com\/pt-br\/","name":"Building Nubank","description":"We make the extraordinary happen","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/building.nubank.com\/pt-br\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/building.nubank.com\/pt-br\/#\/schema\/person\/462f4f5a8d4ec3ccbc3d661dde00f0a4","name":"Nubank Editorial","image":{"@type":"ImageObject","inLanguage":"pt-BR","@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\/pt-br\/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-7Wo","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\/pt-br\/wp-json\/wp\/v2\/posts\/30528","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/users\/178110103"}],"replies":[{"embeddable":true,"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/comments?post=30528"}],"version-history":[{"count":5,"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/posts\/30528\/revisions"}],"predecessor-version":[{"id":30836,"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/posts\/30528\/revisions\/30836"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/media\/30522"}],"wp:attachment":[{"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/media?parent=30528"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/categories?post=30528"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/tags?post=30528"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/building.nubank.com\/pt-br\/wp-json\/wp\/v2\/ppma_author?post=30528"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}