Em todas as indústrias, um dos desafios mais persistentes na engenharia de dados é a evolução do esquema. Os requisitos de negócios mudam, as fontes de dados se alteram e novos campos de evento surgem da noite para o dia, forçando as equipes de engenharia de dados a ajustar constantemente os pipelines e os armazenamentos de estado apenas para manter os sistemas em funcionamento.
Os métodos tradicionais de transmissão são interrompidos quando os esquemas mudam. Os armazenamentos de estado tornam-se incompatíveis e os pipelines falham. As equipes têm a opção de perder data histórica ou passar por um dispendioso tempo de inatividade para migrações de esquemas. Esse não é apenas um problema técnico - é uma barreira para a agilidade dos negócios.
O Apache Spark™ 4.0 introduziu a transformWithStateInPandas, uma API inovadora que torna a evolução do esquema em transmissão com estado não apenas possível, mas transparente. Com gerenciamento de estado inteligente e compatibilidade de esquema automática, seus aplicativos de transmissão evoluem com as necessidades do seu negócio, enquanto preservam informação de estado críticas.
Esta publicação é a quarta e mais recente da série transformWithState:
transformWithStateInPandas.Juntos, estes blogs demonstram como a API transformWithState permite o processamento stateful avançado para cargas de trabalho em tempo real, dando suporte a casos de uso que vão desde o monitoramento de IoT até a analítica de sessão em tempo real.
A evolução de esquemas no Spark Streaming com estado cria um atrito operacional significativo. Com abordagens tradicionais como applyInPandasWithState e session_window, o estado é serializado com metadados de esquema incorporados, criando um acoplamento rígido entre a estrutura de dados e o estado persistente.
Quando você modifica seu schema — adicionando campos, alterando tipos ou reordenando colunas —, o estado existente se torna incompatível com os novos dados de entrada. Incompatibilidades de schema causam falhas de desserialização, forçando você a usar soluções manuais:
o transformWithStateInPandas (TWS) para a evolução do esquemaEmbora o Spark ofereça soluções comprovadas, como session_window para a sessionização básica e applyInPandasWithState para o processamento personalizado com estado, os requisitos de negócios em evolução geralmente precisam de flexibilidade adicional para a evolução contínua do esquema. O transformWithStateInPandas baseia-se nesses fundamentos para abordar especificamente cenários em que os dados e a lógica de negócios precisam evoluir continuamente.
Veja o que torna o transformWithStateInPandas ideal para a evolução do esquema:
Vamos imaginar que você faz parte da equipe de engenharia de dados da "StreamShop", uma plataforma de varejo on-line em rápido crescimento. É segunda-feira de manhã, e seu CEO acabou de entrar na reunião da equipe de engenharia com uma impressão de analítica da concorrência mostrando que eles estão superando vocês nas taxas de conversão. A equipe de marketing está exigindo respostas:
"Estamos gastando milhões em anúncios, mas onde os usuários estão caindo?" "Quais caminhos do cliente realmente levam a compras?" "Podemos personalizar a experiência com base no que os usuários estão fazendo no momento?"
Não se trata de perguntas sobre eventos isolados, mas sim sobre a jornada do usuário, a sequência conectada e a história comportamental que se desenrola à medida que os usuários clicam, navegam, adicionam itens ao carrinho e compram ou abandonam. Essas jornadas são realizadas em sessões.
Seus dados de clickstream chegam de aplicativos web e móveis pelo Apache™ Kafka: cada view de página, clique e "adição ao carrinho", e seu pipeline de transmissão os rastreia, os agrupa em sessões usando um esquema definido e armazena os registros usando flatMapGroupsWithState. No entanto, agora há um novo desafio. Na semana passada, a equipe de desenvolvimento móvel implantou uma nova versão que começou a enviar campos adicionais como device_type e page_category sem informar a equipe de dados.
Sua solução atual de agregação em janelas não suporta esse cenário imediatamente, portanto, você precisa interromper o pipeline, corrigir o esquema e reset os pontos de verificação. Isso não é prático porque você precisa executar essa operação sempre que o esquema for alterado. Você precisa de algo mais robusto, mais flexível e capaz de lidar com a evolução do esquema de forma transparente.
Seus eventos de fluxo de cliques começaram simples com um esquema V1 básico: apenas ID de sessão, ID de usuário, timestamp e tipo de evento. Mas, à medida que a StreamShop evolui, o mesmo acontece com os eventos. Agora você está recebendo eventos V2 com informações contextuais avançadas: tipos de dispositivos, categorias de páginas e dados específicos do comércio, como valores de receita.
O desafio não é apenas lidar com dois esquemas - é evoluir os estados existentes sem perdê-los ou começar de novo. Sua lógica de sessionização precisa lidar com essa evolução de forma elegante, mantendo a continuidade da sessão.
transformWithStateInPandas Evolução do esquema :O que é a evolução do esquema no armazenamento do estado?
A evolução do esquema refere-se à capacidade de uma query de transmissão de lidar com alterações no esquema de armazenamento do estado dos dados sem perder informação de estado ou exigir o reprocessamento completo dos dados históricos. Para transformWithStateInPandas, isso significa que você pode modificar os esquemas de variáveis de estado entre as versões de query, preservando o estado da sessão existente. Vamos dar uma olhada na implementação abaixo.
A Implementação do Sessionizer
Neste exemplo, criamos duas classes personalizadas, SessionizerV1 e SessionizerV2, para processamento avançado de sessões. Elas mostram como o transformWithStateInPandas pode ajudar a rastrear não apenas as métricas básicas, mas também a entender o contexto e a evolução de cada jornada do usuário.
Processador V1: a base
Na V1 do sessionizer, configuramos um schema básico para a sessão para rastrear valores personalizados como event_count e total_revenue.
Processador V2: Definição do esquema evoluído
O V2 demonstra a verdadeira força da evolução do esquema automática. No V2 do processador, adicionamos duas novas colunas e expandimos o tipo de uma coluna existente(event_count), que é perfeitamente atualizada no armazenamento do estado subjacente.
Diferente da sessãonização tradicional baseada em janela, o sessãonizador transformWithStateInPandas pode ajudar a manter um contexto rico sobre a jornada de cada usuário, incluindo seus padrões de engajamento, comportamento de compra e até mesmo quais versões de esquema eles usaram.
Evolução do esquema de estado:
IntegerType → LongType para event_count (conversão automática)device_type e page_category (aparecem como None para o estado V1 evoluído)session_state" name permite a evolução automáticaProcessamento de eventos com a evolução do esquema
O método handleInputRows demonstra como o V2 lida de forma inteligente com os novos eventos do V2 e com o estado evoluído do V1:
A verdadeira complexidade da sessionização moderna não é apenas agrupar eventos - é lidar com a evolução desses eventos ao longo do tempo. Na StreamShop, isso se tornou crítico quando as atualizações de aplicativos móveis começaram a enviar dados aprimorados enquanto a plataforma da Web ainda usava o esquema original.
Veja como a evolução do esquema funciona na prática:
Eventos V1 (esquema original):
Eventos V2 (esquema aprimorado):
Ao usar o mesmo checkpointLocation, a V2 continua o processamento do esquema de armazenamento do estado da V1 a partir do último deslocamento confirmado, permitindo que o esquema evolua sem reprocessar os dados.
A mágica acontece automaticamente quando o processador V2 lê o estado V1. O Databricks realiza essas transformações nos bastidores:
1. Alargamento de tipo (automático)
2. Adição de campo (automática)
3. Detecção de evolução (nossa lógica)
Após a implantação do nosso pipeline de sessionização, os resultados demonstram uma evolução bem-sucedida do esquema. O que acontece é o seguinte:
Resultados da V1 - Sessões iniciais com schema básico:
Saída da sessionalização da V1:

Inspecionando o StateStore:

Saída da sessãonização V2:

Leitura de registros versão V2 do esquema de estado - Sessões aprimoradas com esquema evoluído:
evolved_from_v1: true confirma a evolução do esquema bem-sucedida
A principal percepção: as sessões 1 em V2 mostram evolved_from_v1: true porque:
IntegerType → LongType) aconteceu automaticamenteA evolução do esquema só é compatível com uma combinação de configurações do Spark .
1. Codificação Avro (OBRIGATÓRIO)
2. RocksDB armazenamento do estado (OBRIGATÓRIO)
A evolução do esquema permite que as organizações adicionem novos recursos e percepções sem interromper as operações diárias. Essa flexibilidade permite que as empresas melhorem continuamente, inovem mais rapidamente e permaneçam competitivas.
Em última análise, a capacidade de evoluir esquemas e, ao mesmo tempo, preservar o estado muda a forma como as empresas abordam a analítica em tempo real. Isso garante que a inovação e a excelência operacional andem de mãos dadas, apoiando o crescimento contínuo com o mínimo de interrupções de serviço, ou mesmo nenhuma.
A API transformWithState do Apache Spark™ 4.0 é mais do que uma atualização técnica — é uma mudança na forma como a analítica de clientes em tempo real é construída.
Na StreamShop, ele possibilitou visibilidade em tempo real entre as equipes:
Com a evolução do esquema integrada, nosso pipeline de sessionização se adapta automaticamente à medida que a empresa evolui - novos eventos, plataformas e pontos de contato são tratados sem problemas.
Seja acompanhando jornadas, engajamento ou funis de conversão, o transformWithStateInPandas transforma eventos brutos em percepções acionáveis, criando um entendimento contínuo do cliente que alimenta o crescimento.
Esta publicação conclui nossa série transformWithState, destacando como a API permite o processamento escalonável e com estado em casos de uso de IoT e analítica baseada em sessão.
(This blog post has been translated using AI-powered tools) Original Post
Data Engineering
September 12, 2025/11 min de leitura
Anúncios
September 25, 2025/6 min de leitura


