{"id":1394,"date":"2025-09-07T17:35:42","date_gmt":"2025-09-07T17:35:42","guid":{"rendered":"https:\/\/dataforma.tech\/?p=1394"},"modified":"2025-09-07T17:35:44","modified_gmt":"2025-09-07T17:35:44","slug":"otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks","status":"publish","type":"post","link":"https:\/\/dataforma.tech\/en\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/","title":{"rendered":"Optimizing Memory Management in PySpark: A Practical Guide for Databricks Notebooks"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"584\" src=\"https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-4-1024x584.png\" alt=\"\" class=\"wp-image-1399\" srcset=\"https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-4-1024x584.png 1024w, https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-4-300x171.png 300w, https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-4-768x438.png 768w, https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-4-18x10.png 18w, https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-4.png 1300w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Quem j\u00e1 trabalhou com PySpark sabe como \u00e9 frustrante quando uma aplica\u00e7\u00e3o trava por falta de mem\u00f3ria. Voc\u00ea est\u00e1 l\u00e1, processando dados tranquilamente, quando de repente tudo para e aparece aquela mensagem de erro que ningu\u00e9m quer ver.&nbsp;Acontece que o gerenciamento de mem\u00f3ria no PySpark pode reduzir o consumo de recursos em at\u00e9 2 vezes quando voc\u00ea sabe o que est\u00e1 fazendo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At\u00e9 pouco tempo atr\u00e1s, descobrir onde estava o problema de mem\u00f3ria nas aplica\u00e7\u00f5es PySpark distribu\u00eddas era como procurar agulha no palheiro, especialmente quando o problema estava nos executores Spark. Voc\u00ea ficava tentando adivinhar qual parte do c\u00f3digo estava consumindo toda a mem\u00f3ria dispon\u00edvel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Felizmente, desde o Databricks Runtime 12.0, essa dor de cabe\u00e7a diminuiu bastante com a chegada de ferramentas de an\u00e1lise de mem\u00f3ria diretamente nos executores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hoje n\u00f3s temos acesso a ferramentas de perfilamento de mem\u00f3ria que mostram exatamente quais linhas de c\u00f3digo nas suas UDFs est\u00e3o devorando os recursos. Isso muda completamente a forma como conseguimos fazer as melhorias necess\u00e1rias.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Existe tamb\u00e9m o Adaptive Query Execution, conhecido como AQE, que veio com o Spark 3.x e ajuda a melhorar os planos de execu\u00e7\u00e3o das consultas enquanto elas est\u00e3o rodando, usando as estat\u00edsticas que ele vai coletando.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A pergunta que fica \u00e9: como usar essas ferramentas de forma pr\u00e1tica para melhorar o desempenho dos nossos notebooks no Databricks?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos ver como organizar melhor o layout dos dados, como gerenciar os shuffles sem quebrar tudo, como resolver aqueles problemas chatos de skew e como usar cache de uma forma que realmente fa\u00e7a diferen\u00e7a no desempenho das suas aplica\u00e7\u00f5es.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Organizar os Dados e Escrever Melhor nas Tabelas Delta<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"599\" src=\"https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-5-1024x599.png\" alt=\"\" class=\"wp-image-1400\" srcset=\"https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-5-1024x599.png 1024w, https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-5-300x176.png 300w, https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-5-768x450.png 768w, https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-5-18x12.png 18w, https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-5.png 1300w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Image Source:\u00a0<a href=\"https:\/\/bigdataboutique.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">BigData Boutique<\/a><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea j\u00e1 deve ter passado por aquela situa\u00e7\u00e3o onde uma consulta que deveria ser r\u00e1pida acaba demorando uma eternidade. Muitas vezes o culpado s\u00e3o os &#8220;pequenos arquivos&#8221; no Delta Lake. Quando voc\u00ea est\u00e1 escrevendo dados com frequ\u00eancia, especialmente em streams ou atualiza\u00e7\u00f5es em lote, acabam surgindo milhares de arquivos pequenos que criam uma bagun\u00e7a nos metadados e fazem suas consultas ficarem lentas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Felizmente, o Databricks tem algumas funcionalidades bem \u00fateis para resolver essa quest\u00e3o de layout de dados em tabelas Delta.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">delta.autoOptimize.<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/synapse-analytics\/spark\/optimize-write-for-apache-spark\" target=\"_blank\" rel=\"noreferrer noopener\">optimizeWrite<\/a>&nbsp;e delta.autoOptimize.autoCompact<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Existe uma funcionalidade chamada&nbsp;<strong>optimizeWrite<\/strong>&nbsp;que diminui o n\u00famero de arquivos escritos, fazendo com que cada arquivo fique maior durante as opera\u00e7\u00f5es de escrita. A ideia \u00e9 simples: ela pega v\u00e1rias escritas pequenas na mesma parti\u00e7\u00e3o e junta tudo em uma opera\u00e7\u00e3o s\u00f3 antes de executar, criando arquivos maiores e mais eficientes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ativar essa funcionalidade, voc\u00ea tem duas op\u00e7\u00f5es:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>No n\u00edvel da tabela:\u00a0<code>delta.autoOptimize.optimizeWrite = true<\/code><\/li>\n\n\n\n<li>No n\u00edvel da sess\u00e3o:\u00a0<code>spark.databricks.delta.optimizeWrite.enabled = true<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">O&nbsp;<strong>autoCompact<\/strong>&nbsp;funciona como um complemento, executando automaticamente um pequeno comando optimize depois de cada opera\u00e7\u00e3o de escrita.&nbsp;Basicamente, ele pega dados de arquivos que est\u00e3o abaixo de um certo tamanho e junta em um arquivo maior, isso acontece logo depois que a escrita termina com sucesso.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Configura\u00e7\u00e3o&nbsp;<a href=\"https:\/\/docs.databricks.com\/aws\/en\/delta\/tune-file-size\" target=\"_blank\" rel=\"noreferrer noopener\">delta.targetFileSize<\/a>&nbsp;para controle de tamanho de arquivos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para ajustar o tamanho dos arquivos nas suas tabelas Delta, voc\u00ea pode configurar a propriedade&nbsp;<code>delta.targetFileSize<\/code>&nbsp;com o tamanho que faz mais sentido. Uma vez que voc\u00ea define essa propriedade, todas as opera\u00e7\u00f5es de otimiza\u00e7\u00e3o de layout v\u00e3o fazer o poss\u00edvel para gerar arquivos do tamanho especificado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O pr\u00f3prio Databricks j\u00e1 ajusta automaticamente o tamanho do arquivo baseado no tamanho da tabela:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Para tabelas menores que 2,56 TB: 256 MB<\/li>\n\n\n\n<li>Para tabelas entre 2,56 TB e 10 TB: vai crescendo de forma linear de 256 MB at\u00e9 1 GB<\/li>\n\n\n\n<li>Para tabelas maiores que 10 TB: 1 GB<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Usar ZORDER para deixar dados relacionados no mesmo lugar<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Z-Ordering \u00e9 uma t\u00e9cnica interessante que coloca informa\u00e7\u00f5es relacionadas no mesmo conjunto de arquivos. Essa organiza\u00e7\u00e3o \u00e9 usada automaticamente pelos algoritmos de data-skipping do Delta Lake, o que diminui drasticamente a quantidade de dados que precisam ser lidos durante as consultas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para aplicar Z-Ordering, voc\u00ea especifica as colunas no comando OPTIMIZE:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OPTIMIZE events WHERE date &gt;= current_timestamp() - INTERVAL 1 day ZORDER BY (eventType)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Essa t\u00e9cnica funciona muito bem para colunas que voc\u00ea usa frequentemente em filtros e que t\u00eam alta cardinalidade, ou seja, muitos valores diferentes.&nbsp;Voc\u00ea at\u00e9 pode especificar v\u00e1rias colunas para ZORDER BY separando por v\u00edrgulas, mas a efetividade vai diminuindo conforme voc\u00ea adiciona mais colunas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Shuffles e Parti\u00e7\u00f5es: Como Evitar que os Dados Derramem<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/wsstgprdphotosonic01.blob.core.windows.net\/photosonic\/b5594843-1538-4fa3-83e4-607df027259e.WEBP?st=2025-09-07T17%3A21%3A27Z&amp;se=2025-09-14T17%3A21%3A27Z&amp;sp=r&amp;sv=2025-07-05&amp;sr=b&amp;sig=YUfEkJdYlY\/apBbcPVMxYqd1qus9iOMHc7qVuUZOE%2Bo%3D\" alt=\"Flowchart explaining Apache Spark shuffling, showing wide transformations with shuffling and narrow transformations without shuffling.\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><sub>Image Source:&nbsp;<a href=\"https:\/\/www.linkedin.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">LinkedIn<\/a><\/sub><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O shuffle no PySpark \u00e9 daquelas coisas que podem destruir completamente o desempenho da sua aplica\u00e7\u00e3o. Sempre que voc\u00ea faz joins, agrega\u00e7\u00f5es ou ordena\u00e7\u00f5es, o Spark precisa reorganizar os dados entre os n\u00f3s do cluster. Quando isso n\u00e3o \u00e9 feito direito, os dados come\u00e7am a derramar para o disco, fazendo com que tudo fique lento.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">spark.sql.shuffle.partitions: ajustando na m\u00e3o conforme o volume de dados<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">O Spark vem configurado por padr\u00e3o para usar&nbsp;<a href=\"https:\/\/www.databricks.com\/blog\/2020\/10\/21\/faster-sql-adaptive-query-execution-in-databricks.html\" target=\"_blank\" rel=\"noreferrer noopener\">200 parti\u00e7\u00f5es durante opera\u00e7\u00f5es de shuffle<\/a>. Esse n\u00famero quase nunca \u00e9 o ideal para o que voc\u00ea est\u00e1 fazendo. Se voc\u00ea usa poucas parti\u00e7\u00f5es, cada tarefa vai processar muito dado e pode estourar a mem\u00f3ria, causando aquele spilling chato para o disco.&nbsp;Do outro lado, se voc\u00ea usa muitas parti\u00e7\u00f5es, acaba criando tarefas muito pequenas que gastam mais tempo com overhead do que processando dados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ajustar isso:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>spark.conf.set(\"spark.sql.shuffle.partitions\", 50)  <em># Exemplo para 5GB de dados num cluster de 10 cores<\/em><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Existe uma regra pr\u00e1tica que funciona bem: cada tarefa deveria processar entre 128MB e 200MB de dados. Voc\u00ea pode calcular o n\u00famero ideal de parti\u00e7\u00f5es dividindo o volume total dos dados que v\u00e3o passar pelo shuffle por esse valor.&nbsp;Outra op\u00e7\u00e3o \u00e9 definir como 2 a 3 vezes o n\u00famero total de n\u00facleos de CPU que voc\u00ea tem dispon\u00edvel.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">spark.sql.adaptive.autoOptimizeShuffle.preshufflePartitionSizeInBytes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">O Databricks criou uma funcionalidade chamada Auto-Optimized Shuffle (AOS) que tenta descobrir automaticamente qual \u00e9 o n\u00famero ideal de parti\u00e7\u00f5es:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>spark.conf.set(\"spark.databricks.adaptive.autoOptimizeShuffle.enabled\", \"true\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Todavia essa funcionalidade tem suas limita\u00e7\u00f5es.&nbsp;Quando voc\u00ea trabalha com tabelas que t\u00eam&nbsp;<a href=\"https:\/\/www.databricks.com\/discover\/pages\/optimize-data-workloads-guide\" target=\"_blank\" rel=\"noreferrer noopener\">taxas de compress\u00e3o excepcionalmente altas (20x a 40x)<\/a>, o AOS pode errar feio na estimativa do n\u00famero de parti\u00e7\u00f5es necess\u00e1rias.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">AQE para ajuste autom\u00e1tico das parti\u00e7\u00f5es de shuffle<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">O Adaptive Query Execution est\u00e1 habilitado por padr\u00e3o desde o Apache Spark 3.2.0&nbsp;e uma das coisas mais \u00fateis que ele faz \u00e9 ajustar dinamicamente o n\u00famero de parti\u00e7\u00f5es de shuffle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para configurar o AQE:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>spark.conf.set(\"spark.sql.adaptive.enabled\", \"true\")\nspark.conf.set(\"spark.sql.adaptive.coalescePartitions.enabled\", \"true\")\nspark.conf.set(\"spark.sql.adaptive.advisoryPartitionSizeInBytes\", \"67108864\")  <em># 64MB<\/em><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O que acontece \u00e9 que o AQE analisa o tamanho real dos dados depois do shuffle e ajusta o n\u00famero de parti\u00e7\u00f5es na hora.&nbsp;Imagine que voc\u00ea tem um DataFrame de 10GB com 200 parti\u00e7\u00f5es originais &#8211; o AQE pode reduzir dinamicamente para 50 parti\u00e7\u00f5es bem balanceadas durante a execu\u00e7\u00e3o, melhorando o desempenho sem voc\u00ea precisar fazer nada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O AQE tamb\u00e9m consegue dividir parti\u00e7\u00f5es distorcidas em peda\u00e7os menores, evitando aqueles gargalos que fazem uma tarefa demorar muito mais que as outras e causam spilling. Isso \u00e9 especialmente valioso quando voc\u00ea est\u00e1 trabalhando com dados que t\u00eam caracter\u00edsticas imprevis\u00edveis.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Identificar e Corrigir Skew e Explos\u00e3o de Dados<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/wsstgprdphotosonic01.blob.core.windows.net\/photosonic\/35e871cb-1255-4644-b721-f9afaa4067e8.WEBP?st=2025-09-07T17%3A21%3A29Z&amp;se=2025-09-14T17%3A21%3A29Z&amp;sp=r&amp;sv=2025-07-05&amp;sr=b&amp;sig=6TTvm3C4FiIVdX5FIWIOYcE2uT5jBmh032k\/4pXdc7g%3D\" alt=\"Diagram showing six Apache Spark optimization techniques for data processing including caching, partitioning, and adaptive query execution.\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><sub>Image Source:&nbsp;<a href=\"https:\/\/vlinkinfo.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">VLink Inc.<\/a><\/sub><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Uma das coisas mais chatas quando voc\u00ea est\u00e1 trabalhando com processamento distribu\u00eddo \u00e9 o tal do &#8220;skew&#8221; de dados. \u00c9 aquela situa\u00e7\u00e3o onde os dados ficam todos desbalanceados entre as parti\u00e7\u00f5es do Spark, fazendo com que algumas tarefas tenham que processar muito mais dados que outras.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea pode estar l\u00e1, achando que tudo est\u00e1 correndo bem, quando de repente uma tarefa demora uma eternidade para terminar enquanto as outras j\u00e1 acabaram h\u00e1 muito tempo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Como descobrir skew usando o Spark UI<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">O Spark UI virou meu melhor amigo para ca\u00e7ar esses problemas. Quando voc\u00ea suspeita que tem skew, vai direto olhar:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Na aba\u00a0<strong>Stages<\/strong>, aquelas tarefas que demoram muito mais que a m\u00e9dia<\/li>\n\n\n\n<li>As m\u00e9tricas de\u00a0<strong>Summary Metrics<\/strong>\u00a0onde voc\u00ea v\u00ea diferen\u00e7as enormes entre os percentis<\/li>\n\n\n\n<li>Uma parti\u00e7\u00e3o j\u00e1 \u00e9 considerada problem\u00e1tica quando ela \u00e9\u00a0<a href=\"https:\/\/spark.apache.org\/docs\/latest\/sql-performance-tuning.html\" target=\"_blank\" rel=\"noreferrer noopener\">maior que 5 vezes a mediana e passa de 256MB<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A dica \u00e9 ficar de olho nas m\u00e9tricas de &#8220;skewness&#8221; para identificar onde est\u00e3o os gargalos. Quando a distribui\u00e7\u00e3o est\u00e1 saud\u00e1vel, os valores ficam parecidos em todos os percentis.&nbsp;Mas quando tem skew, voc\u00ea v\u00ea uma diferen\u00e7a brutal entre o 75\u00ba percentil e o valor m\u00e1ximo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Resolver skew com hints e salting<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Desde o Spark 3.0, o AQE consegue lidar automaticamente com joins que t\u00eam skew quando voc\u00ea coloca&nbsp;<code>spark.sql.adaptive.enabled=true<\/code>&nbsp;e&nbsp;<code>spark.sql.adaptive.skewJoin.enabled=true<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mas tem casos que ele n\u00e3o consegue resolver sozinho. A\u00ed voc\u00ea precisa interferir:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Usar skew hints expl\u00edcitos para avisar o Spark sobre colunas problem\u00e1ticas<\/li>\n\n\n\n<li>Aplicar a t\u00e9cnica do &#8220;salting&#8221; &#8211; que basicamente adiciona um pouco de aleatoriedade nas chaves:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>df_salted = df.withColumn(\"salt\", (rand() * 10).cast(\"int\"))\ndf_salted = df_salted.withColumn(\"salted_key\", col(\"key\") + col(\"salt\"))<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O salting funciona redistribuindo os dados de forma mais equilibrada, evitando que alguns recursos fiquem sobrecarregados.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a href=\"https:\/\/www.databricks.com\/discover\/pages\/optimize-data-workloads-guide\" target=\"_blank\" rel=\"noreferrer noopener\">Explode() e joins<\/a>: os vil\u00f5es da explos\u00e3o de dados<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tem duas opera\u00e7\u00f5es que s\u00e3o campe\u00e3s em fazer os dados explodirem:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>explode()<\/strong>: pega colunas que s\u00e3o cole\u00e7\u00f5es e transforma em linhas individuais, multiplicando o volume de dados<\/li>\n\n\n\n<li><strong>joins<\/strong>: especialmente quando eles produzem muito mais linhas do que voc\u00ea esperava (d\u00e1 para verificar isso no n\u00f3 SortMergeJoin do Spark UI)<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">J\u00e1 vi parti\u00e7\u00f5es de 128MB virarem gigabytes por causa dessas explos\u00f5es, e a\u00ed a mem\u00f3ria dispon\u00edvel n\u00e3o aguenta.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Usar reparticionamento para controlar explos\u00f5es<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Quando voc\u00ea est\u00e1 lidando com explos\u00f5es de dados, algumas estrat\u00e9gias podem salvar o dia:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Diminuir o\u00a0<code>spark.sql.files.maxPartitionBytes<\/code>\u00a0de 128MB para 16MB ou 32MB<\/li>\n\n\n\n<li>Executar\u00a0<code>repartition()<\/code>\u00a0logo depois de ler os dados<\/li>\n\n\n\n<li>Para explos\u00f5es que acontecem nos joins, aumentar o n\u00famero de parti\u00e7\u00f5es de shuffle<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Essas t\u00e9cnicas conseguem evitar que os dados sejam jogados para o disco e melhoram muito o gerenciamento de mem\u00f3ria quando voc\u00ea est\u00e1 processando volumes grandes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cache e Persist\u00eancia: Como Ganhar Performance de Verdade<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Usar cache \u00e9 uma daquelas coisas que todo mundo fala que \u00e9 importante, mas na pr\u00e1tica muita gente n\u00e3o sabe direito quando e como usar. Acontece que armazenar dados em cache pode fazer uma diferen\u00e7a enorme no gerenciamento de mem\u00f3ria do PySpark, especialmente quando voc\u00ea precisa reutilizar os mesmos dados v\u00e1rias vezes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Delta Cache do Databricks: o cache que funciona sozinho<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">O cache de disco do Databricks, que antes chamavam de Delta Cache, \u00e9 um recurso que acelera bastante a leitura de dados.&nbsp;Ele cria c\u00f3pias locais dos seus arquivos Parquet usando um formato intermedi\u00e1rio otimizado.&nbsp;O legal \u00e9 que esse recurso j\u00e1 vem ativado automaticamente nos n\u00f3s que t\u00eam volumes SSD, e ele usa no m\u00e1ximo&nbsp;<a href=\"https:\/\/learn.microsoft.com\/pt-br\/azure\/databricks\/optimizations\/disk-cache\" target=\"_blank\" rel=\"noreferrer noopener\">metade do espa\u00e7o dispon\u00edvel<\/a>&nbsp;nesses dispositivos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para verificar se est\u00e1 funcionando ou mexer nas configura\u00e7\u00f5es:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em># Ver como est\u00e1 configurado<\/em>\nspark.conf.get(\"spark.databricks.io.cache.enabled\")\n\n<em># Ligar ou desligar o cache<\/em>\nspark.conf.set(\"spark.databricks.io.cache.enabled\", \"true\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Uma coisa interessante sobre esse cache de disco \u00e9 que ele detecta automaticamente quando os arquivos mudam, ent\u00e3o voc\u00ea n\u00e3o precisa ficar se preocupando em invalidar o cache manualmente. Isso \u00e9 bem diferente do cache padr\u00e3o do Apache Spark.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Como usar cache() e persist() sem quebrar tudo<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Enquanto o Delta Cache cuida dos arquivos, o&nbsp;<code>cache()<\/code>&nbsp;e&nbsp;<code>persist()<\/code>&nbsp;s\u00e3o para melhorar o desempenho quando voc\u00ea vai usar o mesmo DataFrame v\u00e1rias vezes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em># Cache b\u00e1sico (usa MEMORY_AND_DISK por padr\u00e3o)<\/em>\ndf.cache()\n\n<em># Persist com mais controle sobre onde guardar<\/em>\ndf.persist(storageLevel=StorageLevel.MEMORY_ONLY)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Aqui tem uma pegadinha importante: essas duas opera\u00e7\u00f5es s\u00e3o&nbsp;<a href=\"https:\/\/sparkbyexamples.com\/pyspark\/pyspark-cache-explained\/\" target=\"_blank\" rel=\"noreferrer noopener\">opera\u00e7\u00f5es de avalia\u00e7\u00e3o pregui\u00e7osa<\/a>, ou seja, elas s\u00f3 v\u00e3o executar quando voc\u00ea chamar uma a\u00e7\u00e3o. Se voc\u00ea quer que o cache aconte\u00e7a na hora, precisa for\u00e7ar:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>df.persist()\ndf.count()  <em># Isso for\u00e7a o cache a ser materializado<\/em><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Views tempor\u00e1rias ou tabelas? Depende do que voc\u00ea quer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Views tempor\u00e1rias s\u00e3o virtuais, ent\u00e3o toda vez que voc\u00ea acessa elas, a query roda de novo.&nbsp;J\u00e1 as tabelas tempor\u00e1rias materializam os resultados. A escolha depende do seu caso:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Views tempor\u00e1rias<\/strong>: quando \u00e9 algo simples ou que voc\u00ea vai usar s\u00f3 uma vez<\/li>\n\n\n\n<li><strong>Tabelas tempor\u00e1rias<\/strong>: para transforma\u00e7\u00f5es pesadas que voc\u00ea vai acessar v\u00e1rias vezes<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Existe uma estrat\u00e9gia interessante para opera\u00e7\u00f5es que custam caro computacionalmente mas que voc\u00ea vai acessar com frequ\u00eancia. Voc\u00ea pode criar uma view tempor\u00e1ria e depois fazer cache dela:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dataframe.createOrReplaceTempView(\"view_name\")\nspark.sql(\"CACHE TABLE view_name\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Essa abordagem junta o melhor dos dois mundos: a flexibilidade das views com os benef\u00edcios de performance do cache.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Depois de passar por todas essas t\u00e9cnicas de gerenciamento de mem\u00f3ria no PySpark, fica claro que n\u00e3o existe uma solu\u00e7\u00e3o m\u00e1gica que resolve tudo de uma vez. Cada problema tem suas particularidades e requer uma abordagem espec\u00edfica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As ferramentas de an\u00e1lise de mem\u00f3ria que chegaram com o Databricks Runtime 12.0 realmente mudaram o jogo. Antes era muito dif\u00edcil entender onde estava o gargalo, agora conseguimos ver exatamente quais linhas de c\u00f3digo est\u00e3o consumindo mais recursos. Isso facilita muito nossa vida na hora de fazer as melhorias necess\u00e1rias.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vimos como o layout dos dados em tabelas Delta pode fazer uma diferen\u00e7a enorme na performance. O optimizeWrite e o autoCompact resolvem aquele problema chato dos pequenos arquivos, enquanto o ZORDER ajuda bastante quando voc\u00ea precisa consultar dados espec\u00edficos com frequ\u00eancia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A quest\u00e3o dos shuffles e parti\u00e7\u00f5es continua sendo um dos pontos mais importantes para evitar que os dados sejam despejados no disco. O AQE ajuda bastante nisso, mas ainda precisamos entender nossos dados e ajustar as configura\u00e7\u00f5es quando necess\u00e1rio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aqui \u00e9 importante destacar que problemas de skew e explos\u00e3o de dados podem aparecer de formas inesperadas, especialmente quando voc\u00ea est\u00e1 trabalhando com volumes grandes. Saber identificar esses problemas no Spark UI e ter as t\u00e9cnicas de salting na manga faz toda a diferen\u00e7a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As estrat\u00e9gias de cache, tanto o Delta Cache quanto o persist() nos DataFrames, completam esse conjunto de ferramentas. Quando usadas corretamente, eliminam muito reprocessamento desnecess\u00e1rio e economizam recursos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por\u00e9m, todas essas t\u00e9cnicas hoje j\u00e1 fazem parte do cotidiano de quem trabalha com big data, e n\u00f3s de alguma forma precisamos nos adaptar constantemente conforme nossos dados e workloads evoluem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O importante \u00e9 lembrar que otimiza\u00e7\u00e3o de mem\u00f3ria n\u00e3o \u00e9 algo que voc\u00ea faz uma vez e esquece. \u00c9 um processo cont\u00ednuo que precisa acompanhar o crescimento dos seus dados e a evolu\u00e7\u00e3o das suas aplica\u00e7\u00f5es. Cada novo projeto traz seus pr\u00f3prios desafios, e ter essas ferramentas bem compreendidas facilita muito o trabalho de resolver os gargalos que aparecem pelo caminho.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para quem quer se aprofundar mais nesse universo de processamento de dados em larga escala, vale a pena continuar estudando e praticando essas t\u00e9cnicas em cen\u00e1rios reais. A experi\u00eancia pr\u00e1tica \u00e9 o que realmente consolida esse conhecimento.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FAQs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q1. Como o Adaptive Query Execution (AQE) melhora o desempenho no PySpark?<\/strong>&nbsp;O AQE otimiza consultas durante a execu\u00e7\u00e3o, ajustando dinamicamente o n\u00famero de parti\u00e7\u00f5es de shuffle e dividindo parti\u00e7\u00f5es distorcidas. Isso resulta em melhor utiliza\u00e7\u00e3o de recursos e redu\u00e7\u00e3o de gargalos de performance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q2. Quais s\u00e3o as melhores pr\u00e1ticas para evitar o problema de &#8220;pequenos arquivos&#8221; no Delta Lake?<\/strong>&nbsp;Utilize recursos como optimizeWrite e autoCompact, ajuste o delta.targetFileSize e aplique ZORDER em colunas frequentemente filtradas. Essas t\u00e9cnicas otimizam o layout de dados, melhorando o desempenho das consultas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q3. Como identificar e corrigir problemas de skew de dados no Spark?<\/strong>&nbsp;Analise o Spark UI para identificar tarefas que demoram mais que a m\u00e9dia e use m\u00e9tricas de shuffle. Para corrigir, utilize skew hints, implemente &#8220;salting&#8221; ou aproveite o AQE para gerenciar automaticamente joins distorcidos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q4. Qual a diferen\u00e7a entre o cache de disco do Databricks e o cache do Apache Spark?<\/strong>&nbsp;O cache de disco do Databricks (Delta Cache) otimiza a leitura de arquivos Parquet, detectando automaticamente altera\u00e7\u00f5es. J\u00e1 o cache do Spark (cache() e persist()) melhora o desempenho de transforma\u00e7\u00f5es repetidas em DataFrames.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Q5. Quando devo usar views tempor\u00e1rias em vez de tabelas intermedi\u00e1rias no Spark?<\/strong>&nbsp;Use views tempor\u00e1rias para consultas simples ou uso \u00fanico, e tabelas tempor\u00e1rias para transforma\u00e7\u00f5es complexas ou m\u00faltiplos acessos. Para opera\u00e7\u00f5es custosas e frequentes, considere criar uma view tempor\u00e1ria com cache para combinar flexibilidade e performance.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Refer\u00eancias<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">[1] &#8211;&nbsp;<a href=\"https:\/\/www.databricks.com\/discover\/pages\/optimize-data-workloads-guide\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.databricks.com\/discover\/pages\/optimize-data-workloads-guide<\/a><br>[2] &#8211;&nbsp;<a href=\"https:\/\/www.databricks.com\/blog\/2022\/11\/30\/memory-profiling-pyspark.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.databricks.com\/blog\/2022\/11\/30\/memory-profiling-pyspark.html<\/a><br>[3] &#8211;&nbsp;<a href=\"https:\/\/blog.dataengineerthings.org\/a-quick-guide-to-spark-and-databricks-optimization-engines-1d2089185cf2\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/blog.dataengineerthings.org\/a-quick-guide-to-spark-and-databricks-optimization-engines-1d2089185cf2<\/a><br>[4] &#8211;&nbsp;<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/synapse-analytics\/spark\/optimize-write-for-apache-spark\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/learn.microsoft.com\/en-us\/azure\/synapse-analytics\/spark\/optimize-write-for-apache-spark<\/a><br>[5] &#8211;&nbsp;<a href=\"https:\/\/delta.io\/blog\/delta-lake-optimize\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/delta.io\/blog\/delta-lake-optimize\/<\/a><br>[6] &#8211;&nbsp;<a href=\"https:\/\/docs.databricks.com\/aws\/en\/delta\/tune-file-size\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/docs.databricks.com\/aws\/en\/delta\/tune-file-size<\/a><br>[7] &#8211;&nbsp;<a href=\"https:\/\/docs.databricks.com\/aws\/en\/delta\/data-skipping\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/docs.databricks.com\/aws\/en\/delta\/data-skipping<\/a><br>[8] &#8211;&nbsp;<a href=\"https:\/\/community.databricks.com\/t5\/data-engineering\/what-is-z-ordering-in-delta-and-what-are-some-best-practices-on\/td-p\/26639\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/community.databricks.com\/t5\/data-engineering\/what-is-z-ordering-in-delta-and-what-are-some-best-practices-on\/td-p\/26639<\/a><br>[9] &#8211;&nbsp;<a href=\"https:\/\/www.databricks.com\/blog\/2020\/10\/21\/faster-sql-adaptive-query-execution-in-databricks.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.databricks.com\/blog\/2020\/10\/21\/faster-sql-adaptive-query-execution-in-databricks.html<\/a><br>[10] &#8211;&nbsp;<a href=\"https:\/\/www.sparkcodehub.com\/pyspark\/performance\/shuffle-optimization\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.sparkcodehub.com\/pyspark\/performance\/shuffle-optimization<\/a><br>[11] &#8211;&nbsp;<a href=\"https:\/\/spark.apache.org\/docs\/3.5.0\/sql-performance-tuning.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/spark.apache.org\/docs\/3.5.0\/sql-performance-tuning.html<\/a><br>[12] &#8211;&nbsp;<a href=\"https:\/\/www.databricks.com\/notebooks\/gallery\/SparkAdaptiveQueryExecution.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.databricks.com\/notebooks\/gallery\/SparkAdaptiveQueryExecution.html<\/a><br>[13] &#8211;&nbsp;<a href=\"https:\/\/docs.aws.amazon.com\/emr\/latest\/ReleaseGuide\/emr-spark-performance.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/docs.aws.amazon.com\/emr\/latest\/ReleaseGuide\/emr-spark-performance.html<\/a><br>[14] &#8211;&nbsp;<a href=\"https:\/\/aws.amazon.com\/blogs\/big-data\/detect-and-handle-data-skew-on-aws-glue\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/aws.amazon.com\/blogs\/big-data\/detect-and-handle-data-skew-on-aws-glue\/<\/a><br>[15] &#8211;&nbsp;<a href=\"https:\/\/www.linkedin.com\/pulse\/what-data-skewness-spark-how-handle-code-soutir-sen-xf6hf\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.linkedin.com\/pulse\/what-data-skewness-spark-how-handle-code-soutir-sen-xf6hf<\/a><br>[16] &#8211;&nbsp;<a href=\"https:\/\/docs.aws.amazon.com\/prescriptive-guidance\/latest\/tuning-aws-glue-for-apache-spark\/optimize-shuffles.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/docs.aws.amazon.com\/prescriptive-guidance\/latest\/tuning-aws-glue-for-apache-spark\/optimize-shuffles.html<\/a><br>[17] &#8211;&nbsp;<a href=\"https:\/\/spark.apache.org\/docs\/latest\/sql-performance-tuning.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/spark.apache.org\/docs\/latest\/sql-performance-tuning.html<\/a><br>[18] &#8211;&nbsp;<a href=\"https:\/\/spark.apache.org\/docs\/3.5.3\/sql-performance-tuning.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/spark.apache.org\/docs\/3.5.3\/sql-performance-tuning.html<\/a><br>[19] &#8211;&nbsp;<a href=\"https:\/\/www.linkedin.com\/pulse\/handling-data-skewness-spark-power-salting-pyspark-kommanaboina-vskic\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.linkedin.com\/pulse\/handling-data-skewness-spark-power-salting-pyspark-kommanaboina-vskic<\/a><br>[20] &#8211;&nbsp;<a href=\"https:\/\/docs.databricks.com\/aws\/en\/optimizations\/disk-cache\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/docs.databricks.com\/aws\/en\/optimizations\/disk-cache<\/a><br>[21] &#8211;&nbsp;<a href=\"https:\/\/learn.microsoft.com\/pt-br\/azure\/databricks\/optimizations\/disk-cache\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/learn.microsoft.com\/pt-br\/azure\/databricks\/optimizations\/disk-cache<\/a><br>[22] &#8211;&nbsp;<a href=\"https:\/\/sparkbyexamples.com\/pyspark\/pyspark-cache-explained\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/sparkbyexamples.com\/pyspark\/pyspark-cache-explained\/<\/a><br>[23] &#8211;&nbsp;<a href=\"https:\/\/community.databricks.com\/t5\/data-engineering\/temp-table-vs-temp-view-vs-temp-table-function-which-one-is\/td-p\/4087\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/community.databricks.com\/t5\/data-engineering\/temp-table-vs-temp-view-vs-temp-table-function-which-one-is\/td-p\/4087<\/a><br>[24] &#8211;&nbsp;<a href=\"https:\/\/www.chaosgenius.io\/blog\/databricks-temporary-table\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.chaosgenius.io\/blog\/databricks-temporary-table\/<\/a><br>[25] &#8211;&nbsp;<a href=\"https:\/\/stackoverflow.com\/questions\/50716772\/spark-tempview-performance\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/stackoverflow.com\/questions\/50716772\/spark-tempview-performance<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\ude80 Optimize your memory management in PySpark with these valuable tips for Databricks notebooks! \ud83d\udcbb Since Databricks Runtime 12.0, memory analysis tools make it easier to identify bottlenecks and improve performance.<\/p>","protected":false},"author":1,"featured_media":1399,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[26,35,38,37,36],"class_list":["post-1394","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-data-lake","tag-databricks","tag-delta-lake","tag-memoria","tag-pyspark"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Otimizando o Gerenciamento de Mem\u00f3ria no PySpark: Guia Pr\u00e1tico para Notebooks Databricks - Dataforma | Business Intelligence<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/dataforma.tech\/en\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Otimizando o Gerenciamento de Mem\u00f3ria no PySpark: Guia Pr\u00e1tico para Notebooks Databricks - Dataforma | Business Intelligence\" \/>\n<meta property=\"og:description\" content=\"\ud83d\ude80 Otimize seu gerenciamento de mem\u00f3ria no PySpark com estas dicas valiosas para notebooks Databricks! \ud83d\udcbb Desde o Databricks Runtime 12.0, ferramentas de an\u00e1lise de mem\u00f3ria facilitam identificar gargalos e melhorar o desempenho.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dataforma.tech\/en\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/\" \/>\n<meta property=\"og:site_name\" content=\"Dataforma | Business Intelligence\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-07T17:35:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-07T17:35:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-4.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1300\" \/>\n\t<meta property=\"og:image:height\" content=\"742\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Guilherme Rodrigues\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@dataformacomp\" \/>\n<meta name=\"twitter:site\" content=\"@dataformacomp\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Guilherme Rodrigues\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/dataforma.tech\\\/blog\\\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dataforma.tech\\\/blog\\\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\\\/\"},\"author\":{\"name\":\"Guilherme Rodrigues\",\"@id\":\"https:\\\/\\\/dataforma.tech\\\/#\\\/schema\\\/person\\\/35d2d0ba7ea231ccd708f76e6a84b572\"},\"headline\":\"Otimizando o Gerenciamento de Mem\u00f3ria no PySpark: Guia Pr\u00e1tico para Notebooks Databricks\",\"datePublished\":\"2025-09-07T17:35:42+00:00\",\"dateModified\":\"2025-09-07T17:35:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/dataforma.tech\\\/blog\\\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\\\/\"},\"wordCount\":2977,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/dataforma.tech\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/dataforma.tech\\\/blog\\\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/dataforma.tech\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/image-4.png\",\"keywords\":[\"Data Lake\",\"DataBricks\",\"Delta Lake\",\"Mem\u00f3ria\",\"Pyspark\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/dataforma.tech\\\/blog\\\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/dataforma.tech\\\/blog\\\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\\\/\",\"url\":\"https:\\\/\\\/dataforma.tech\\\/blog\\\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\\\/\",\"name\":\"Otimizando o Gerenciamento de Mem\u00f3ria no PySpark: Guia Pr\u00e1tico para Notebooks Databricks - Dataforma | Business Intelligence\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dataforma.tech\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/dataforma.tech\\\/blog\\\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/dataforma.tech\\\/blog\\\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/dataforma.tech\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/image-4.png\",\"datePublished\":\"2025-09-07T17:35:42+00:00\",\"dateModified\":\"2025-09-07T17:35:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/dataforma.tech\\\/blog\\\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/dataforma.tech\\\/blog\\\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/dataforma.tech\\\/blog\\\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\\\/#primaryimage\",\"url\":\"https:\\\/\\\/dataforma.tech\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/image-4.png\",\"contentUrl\":\"https:\\\/\\\/dataforma.tech\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/image-4.png\",\"width\":1300,\"height\":742},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/dataforma.tech\\\/blog\\\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\\\/\\\/dataforma.tech\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Otimizando o Gerenciamento de Mem\u00f3ria no PySpark: Guia Pr\u00e1tico para Notebooks Databricks\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/dataforma.tech\\\/#website\",\"url\":\"https:\\\/\\\/dataforma.tech\\\/\",\"name\":\"Dataforma | Business Intelligence\",\"description\":\"Consultoria em BI\",\"publisher\":{\"@id\":\"https:\\\/\\\/dataforma.tech\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/dataforma.tech\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/dataforma.tech\\\/#organization\",\"name\":\"Dataforma | Business Intelligence\",\"url\":\"https:\\\/\\\/dataforma.tech\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/dataforma.tech\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/dataforma.tech\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Logo-Dataforma-01.svg\",\"contentUrl\":\"https:\\\/\\\/dataforma.tech\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Logo-Dataforma-01.svg\",\"width\":300,\"height\":42,\"caption\":\"Dataforma | Business Intelligence\"},\"image\":{\"@id\":\"https:\\\/\\\/dataforma.tech\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/dataformacomp\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/dataforma.tech\\\/#\\\/schema\\\/person\\\/35d2d0ba7ea231ccd708f76e6a84b572\",\"name\":\"Guilherme Rodrigues\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b3128f6bce22b9a5c34983edfb84d9cdffc980bf397edf478a5cc4b8b271e75?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b3128f6bce22b9a5c34983edfb84d9cdffc980bf397edf478a5cc4b8b271e75?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b3128f6bce22b9a5c34983edfb84d9cdffc980bf397edf478a5cc4b8b271e75?s=96&d=mm&r=g\",\"caption\":\"Guilherme Rodrigues\"},\"sameAs\":[\"https:\\\/\\\/dataforma.tech\"],\"url\":\"https:\\\/\\\/dataforma.tech\\\/en\\\/blog\\\/author\\\/heyoguilherme-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Otimizando o Gerenciamento de Mem\u00f3ria no PySpark: Guia Pr\u00e1tico para Notebooks Databricks - Dataforma | Business Intelligence","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:\/\/dataforma.tech\/en\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/","og_locale":"en_US","og_type":"article","og_title":"Otimizando o Gerenciamento de Mem\u00f3ria no PySpark: Guia Pr\u00e1tico para Notebooks Databricks - Dataforma | Business Intelligence","og_description":"\ud83d\ude80 Otimize seu gerenciamento de mem\u00f3ria no PySpark com estas dicas valiosas para notebooks Databricks! \ud83d\udcbb Desde o Databricks Runtime 12.0, ferramentas de an\u00e1lise de mem\u00f3ria facilitam identificar gargalos e melhorar o desempenho.","og_url":"https:\/\/dataforma.tech\/en\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/","og_site_name":"Dataforma | Business Intelligence","article_published_time":"2025-09-07T17:35:42+00:00","article_modified_time":"2025-09-07T17:35:44+00:00","og_image":[{"width":1300,"height":742,"url":"https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-4.png","type":"image\/png"}],"author":"Guilherme Rodrigues","twitter_card":"summary_large_image","twitter_creator":"@dataformacomp","twitter_site":"@dataformacomp","twitter_misc":{"Written by":"Guilherme Rodrigues","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/dataforma.tech\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/#article","isPartOf":{"@id":"https:\/\/dataforma.tech\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/"},"author":{"name":"Guilherme Rodrigues","@id":"https:\/\/dataforma.tech\/#\/schema\/person\/35d2d0ba7ea231ccd708f76e6a84b572"},"headline":"Otimizando o Gerenciamento de Mem\u00f3ria no PySpark: Guia Pr\u00e1tico para Notebooks Databricks","datePublished":"2025-09-07T17:35:42+00:00","dateModified":"2025-09-07T17:35:44+00:00","mainEntityOfPage":{"@id":"https:\/\/dataforma.tech\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/"},"wordCount":2977,"commentCount":0,"publisher":{"@id":"https:\/\/dataforma.tech\/#organization"},"image":{"@id":"https:\/\/dataforma.tech\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/#primaryimage"},"thumbnailUrl":"https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-4.png","keywords":["Data Lake","DataBricks","Delta Lake","Mem\u00f3ria","Pyspark"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/dataforma.tech\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/dataforma.tech\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/","url":"https:\/\/dataforma.tech\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/","name":"Otimizando o Gerenciamento de Mem\u00f3ria no PySpark: Guia Pr\u00e1tico para Notebooks Databricks - Dataforma | Business Intelligence","isPartOf":{"@id":"https:\/\/dataforma.tech\/#website"},"primaryImageOfPage":{"@id":"https:\/\/dataforma.tech\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/#primaryimage"},"image":{"@id":"https:\/\/dataforma.tech\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/#primaryimage"},"thumbnailUrl":"https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-4.png","datePublished":"2025-09-07T17:35:42+00:00","dateModified":"2025-09-07T17:35:44+00:00","breadcrumb":{"@id":"https:\/\/dataforma.tech\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dataforma.tech\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/dataforma.tech\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/#primaryimage","url":"https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-4.png","contentUrl":"https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/09\/image-4.png","width":1300,"height":742},{"@type":"BreadcrumbList","@id":"https:\/\/dataforma.tech\/blog\/otimizando-o-gerenciamento-de-memoria-no-pyspark-guia-pratico-para-notebooks-databricks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/dataforma.tech\/"},{"@type":"ListItem","position":2,"name":"Otimizando o Gerenciamento de Mem\u00f3ria no PySpark: Guia Pr\u00e1tico para Notebooks Databricks"}]},{"@type":"WebSite","@id":"https:\/\/dataforma.tech\/#website","url":"https:\/\/dataforma.tech\/","name":"Dataforma | Business Intelligence","description":"BI Consulting","publisher":{"@id":"https:\/\/dataforma.tech\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dataforma.tech\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/dataforma.tech\/#organization","name":"Dataforma | Business Intelligence","url":"https:\/\/dataforma.tech\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/dataforma.tech\/#\/schema\/logo\/image\/","url":"https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/07\/Logo-Dataforma-01.svg","contentUrl":"https:\/\/dataforma.tech\/wp-content\/uploads\/2025\/07\/Logo-Dataforma-01.svg","width":300,"height":42,"caption":"Dataforma | Business Intelligence"},"image":{"@id":"https:\/\/dataforma.tech\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/dataformacomp"]},{"@type":"Person","@id":"https:\/\/dataforma.tech\/#\/schema\/person\/35d2d0ba7ea231ccd708f76e6a84b572","name":"Guilherme Rodrigues","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/2b3128f6bce22b9a5c34983edfb84d9cdffc980bf397edf478a5cc4b8b271e75?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2b3128f6bce22b9a5c34983edfb84d9cdffc980bf397edf478a5cc4b8b271e75?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2b3128f6bce22b9a5c34983edfb84d9cdffc980bf397edf478a5cc4b8b271e75?s=96&d=mm&r=g","caption":"Guilherme Rodrigues"},"sameAs":["https:\/\/dataforma.tech"],"url":"https:\/\/dataforma.tech\/en\/blog\/author\/heyoguilherme-com\/"}]}},"_links":{"self":[{"href":"https:\/\/dataforma.tech\/en\/wp-json\/wp\/v2\/posts\/1394","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dataforma.tech\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dataforma.tech\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dataforma.tech\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dataforma.tech\/en\/wp-json\/wp\/v2\/comments?post=1394"}],"version-history":[{"count":1,"href":"https:\/\/dataforma.tech\/en\/wp-json\/wp\/v2\/posts\/1394\/revisions"}],"predecessor-version":[{"id":1401,"href":"https:\/\/dataforma.tech\/en\/wp-json\/wp\/v2\/posts\/1394\/revisions\/1401"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dataforma.tech\/en\/wp-json\/wp\/v2\/media\/1399"}],"wp:attachment":[{"href":"https:\/\/dataforma.tech\/en\/wp-json\/wp\/v2\/media?parent=1394"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dataforma.tech\/en\/wp-json\/wp\/v2\/categories?post=1394"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dataforma.tech\/en\/wp-json\/wp\/v2\/tags?post=1394"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}