Pular para o conteúdo

Processamento de dados · tema 8 de 30

Particionamento de dados

35 min · 2 vídeos · 12 cards · 2 drill

Por que cai

É onde a banca testa julgamento técnico com número. Todo mundo sabe dizer que particionamento acelera consulta; poucos sabem explicar cardinalidade, small files e hot partition, e menos ainda percebem que particionamento em banco relacional e em data lake são mecanismos diferentes com o mesmo nome.

Pré-teste · 1 de 2

responda antes de ver

Qual é o principal mecanismo pelo qual particionar acelera uma consulta?

Confiança:

Vídeo · português · 26 min

Cobre o lado relacional com profundidade, que é a metade que costuma faltar em quem só viu Spark. Assista prestando atenção em como a partição interage com índice e estatística — isso não existe no lake.

Em uma frase

Particionar é dividir fisicamente o dado por uma chave para que a consulta leia apenas o pedaço que interessa, em vez de varrer tudo.

Para que serve: partition pruning

partition pruningDescarte de partições inteiras antes de abrir qualquer arquivo, com base no filtro da consulta.

Esse é o ganho central, e ele tem uma condição: a consulta precisa filtrar pela coluna de partição. Se o relatório do time de risco sempre traz WHERE data_transacao BETWEEN ..., particionar por data faz o motor ler dois diretórios em vez de dois mil. Se ninguém filtra por aquela coluna, você criou complexidade sem retorno.

Há um segundo ganho, menos citado e muito valioso em banco: expiração vira operação de metadado. Descartar log com mais de 90 dias é remover diretórios, não varrer a tabela procurando linhas velhas.

Data ou chave de negócio?

Data é o padrão em serviço financeiro por três motivos: quase toda consulta tem recorte temporal, o volume por dia é previsível, e o ciclo de vida do dado é temporal. Chave de negócio — produto, canal, segmento — só funciona quando a cardinalidade é baixa e a distribuição é equilibrada e as consultas filtram por ela.

Na prática, o desenho comum é data como primeiro nível e, no máximo, uma segunda coluna de baixíssima cardinalidade.

Cardinalidade e small files

O motor paga um custo fixo por arquivo: listar, abrir, ler o rodapé de metadados, agendar a task. Quando o arquivo tem 4 KB, esse custo fixo é praticamente todo o tempo de execução. A documentação do Databricks recomenda pelo menos 1 GB por partição e desaconselha particionar tabelas abaixo de 1 TB — número de plataforma, não lei universal, mas é a ordem de grandeza que você deve ter na cabeça.

O extremo oposto também existe: cardinalidade baixa demais, como particionar seis anos de transação por ano, dá partições grandes que não podem ser podadas com precisão.

Hot partition

Distribuição desigual é o problema mais difícil de enxergar. Particionar eventos de PIX por instituição recebedora parece razoável até você olhar os números: umas poucas instituições concentram a maior parte do volume. Como cada partição vira uma unidade de trabalho, uma task fica com quase todo o dado e as outras terminam em segundos. O job passa a demorar o tempo da maior task, e comprar mais nós não ajuda.

Sintoma na Spark UI: dentro do mesmo stage, uma task destoa em ordem de grandeza em duração e em bytes lidos. Correções: trocar a chave, compor com uma segunda coluna, aplicar hash ou salt no valor concentrado, ou tirar aquela dimensão da partição e colocá-la em bucket.

Bucketing e clustering

Bucketing distribui as linhas por hash da chave em um número fixo de arquivos, dentro da partição. Resolve um problema diferente: colocalizar a mesma chave dos dois lados de um join para evitar shuffle, e agrupar leituras por chave fina sem criar diretório para cada valor.

TécnicaComo divideResolveSofre com cardinalidade alta?
PartiçãoDiretórios ou segmentos por valor da chavePruning por filtro e expiração barataSim, gera small files
Bucket / clusteringHash da chave em N arquivos fixosJoin e agregação por chave sem shuffleNão, N é fixo

A combinação clássica em banco: data no diretório, cartão no bucket.

Mesmo nome, mecanismos diferentes

Como escolher a chave

  1. 1Levante o filtro dominante das consultas reais, não o imaginado.
  2. 2Meça a cardinalidade e a distribuição dos valores candidatos.
  3. 3Estime o tamanho médio da partição resultante e compare com a ordem de grandeza de 1 GB.
  4. 4Se a chave natural tiver cardinalidade alta, use granularidade mais grossa na partição e bucket na chave fina.
  5. 5Valide depois de implantar: distribuição de tasks, contagem e tamanho médio dos arquivos.

Se quiser outro ângulo

Mostra o lado analítico e o efeito direto no custo da consulta. Repare que aqui a métrica de sucesso é bytes varridos, não segundos.

Como cai na sabatina

Como você particionaria a tabela de transações de cartão?

Erros comuns

  • Particionar por uma chave de altíssima cardinalidade, como CPF ou id da transação. Cada partição vira um arquivo minúsculo, e o custo de abrir milhões de arquivos supera qualquer ganho de leitura.
  • Particionar por uma chave que a consulta não filtra. Se ninguém escreve WHERE naquela coluna, não existe partition pruning e você só criou complexidade.
  • Ignorar a distribuição real dos valores. Particionar por agência ou por bandeira quando 60 por cento do volume está em um único valor cria hot partition: uma task carrega o job inteiro.
  • Confundir partição de tabela relacional com pasta no data lake. No relacional é uma estrutura interna do banco com índices e estatísticas; no lake é literalmente um diretório no caminho do arquivo.
  • Tratar bucketing como sinônimo de particionamento. Bucket distribui por hash em um número fixo de arquivos e serve para join e agregação por chave; partição fisicamente separa e serve para pruning.
  • Particionar tabela pequena. Abaixo de alguns gigabytes, particionar costuma piorar: você cria arquivos pequenos e sobrecarrega o metastore sem ganhar leitura.

Flashcards

Card 1 de 12

0 certos · 0 a rever

Drill

Escolha a chave de partição

Para cada tabela do banco, diga qual chave você usaria e por quê. Formule em voz alta antes de abrir a resposta; a justificativa vale mais que a chave.

  1. 1.Transações de cartão, 8 bilhões de linhas, consultadas quase sempre por intervalo de datas e às vezes por cliente.

  2. 2.Cadastro de clientes, 12 milhões de linhas, consultado por CPF pelo aplicativo.

  3. 3.Eventos de PIX, alto volume, com consultas por dia e por instituição recebedora, sendo que três instituições concentram a maior parte.

  4. 4.Log de acesso ao internet banking, retido por 90 dias e depois descartado.

  5. 5.Tabela de câmbio com 40 mil linhas atualizada uma vez por dia.

  6. 6.Propostas de crédito, consultadas por período e por produto, com cinco produtos de volume parecido.

Drill

Partição, bucket ou nada?

Classifique a técnica adequada para cada objetivo declarado.

  1. 1.Fazer a consulta ler apenas os arquivos de março de 2026.

  2. 2.Evitar shuffle no join entre transações e cartões pela chave do cartão.

  3. 3.Acelerar a busca de um único CPF numa tabela de 12 milhões de linhas em banco relacional.

  4. 4.Descartar todo o dado com mais de 90 dias sem varrer a tabela.

Quiz · 1 de 2

Qual afirmação descreve corretamente a diferença entre particionamento em banco relacional e em data lake?

Explique para um gerente

Explique para um analista de negócio por que a consulta do relatório dele caiu de dez minutos para dez segundos sem que ninguém tenha comprado máquina nova.

Responda em voz alta antes de seguir. Se travar numa palavra técnica, é sinal de que ainda não entendeu essa parte.

Perguntas de sabatina deste tema

  • · Como você particionaria a tabela de transações de cartão do banco?
  • · Um job que lê a tabela de eventos de PIX ficou dez vezes mais lento depois que o time particionou por instituição recebedora. O que você investigaria?
Responder no simulado

Para ir além