Ir para o conteúdo principal
Clientes

Como uma grande ferrovia de carga escalou a criação de pipelines com o Genie Code

Uma empresa canadense líder em transporte e logística utilizou o Genie Code, o Unity Catalog e Agent Skills personalizadas para automatizar a modernização governada de pipelines legados, reduzindo a ingestão de novas tabelas de dias para minutos.

por Dinesh Chandrasekaran, Subhadip Chanda, Julia Brouillette e Gal Oshri

  • A empresa utilizou o Databricks Genie Code para modernizar automaticamente pipelines legados, reduzindo o tempo de entrega de pipelines de dias por tabela para minutos.
  • A modernização preserva os padrões corporativos e a fundamentação de metadados usando as Agent Skills do Genie Code e a integração com o Unity Catalog.
  • Ao resolver o desafio central de escala de reconstruir centenas de pipelines de dados manualmente, mantendo os padrões corporativos, a fundamentação de metadados e a revisão de especialistas, a abordagem alcançou mais de 90% de automação para a ingestão de novas tabelas e reduziu a entrega de pipelines de dias por tabela para minutos.

Uma das maiores redes ferroviárias do Canadá se estende por cerca de 20.000 milhas de rotas em todo o Canadá e nos Estados Unidos, apoiando a movimentação de mais de 250 bilhões de dólares canadenses em mercadorias anualmente. Para uma organização que opera nessa escala, modernizar um patrimônio de dados de décadas nunca seria uma tarefa de uma tabela por vez.

Com centenas de pipelines em andamento, uma demanda crescente por análises em tempo real e IA, e um profundo conhecimento institucional incorporado em sistemas legados, a empresa precisava de uma maneira de escalar a modernização sem escalar o esforço de desenvolvimento manual.

Usando o Databricks Genie Code, Unity Catalog, Agent Skills personalizados e um aplicativo Streamlit desenvolvido no Databricks Apps, a equipe transformou o próprio desenvolvimento de pipelines em uma fábrica repetível. Um breve prompt YAML agora pode gerar código de ingestão pronto para produção, baseado em metadados de catálogo em tempo real e alinhado por padrão às convenções da empresa, incluindo definições de tabela, lógica de carregamento histórico, lógica de ingestão de streaming, lógica de mesclagem incremental e testes automatizados.

O resultado é mais de 90% de automação para a ingestão de novas tabelas, entrega de pipelines reduzida de dias para minutos e um programa de modernização que pode escalar com a empresa, em vez de ser limitado pela capacidade dos desenvolvedores.

Modernizando um patrimônio de dados complexo em escala empresarial

Como muitas grandes empresas, a companhia construiu sua infraestrutura analítica ao longo de décadas em sistemas de mainframe, data warehouses legados, plataformas de ETL empresariais e appliances dedicados. À medida que a empresa avançava em direção a uma arquitetura lakehouse moderna, o desafio era maior do que apenas a migração: a equipe precisava simplificar e padronizar a forma como os pipelines eram criados, preservando a lógica de negócios crítica em uma grande infraestrutura legada.

Antes da automação, criar um pipeline para uma única tabela exigia um esforço de vários dias. As equipes precisavam inspecionar esquemas de origem, definir a lógica de negócios em uma planilha de Mapeamento de Origem para Destino (Source-to-Target Mapping), criar lógica de ingestão histórica e de streaming, gravar pipelines de mesclagem incremental, implementar transformações downstream e criar cobertura de testes para casos como evolução de esquema, renomeação de colunas, conversões de tipo (type casts) e exclusões lógicas (soft deletes).

Esse trabalho era gerenciável para uma tabela; não era para centenas. A real limitação era o esforço manual necessário para traduzir a lógica legada em pipelines de lakehouse de forma repetitiva e consistente.

A empresa precisava modernizar não apenas seus pipelines, mas o processo de criação de centenas de pipelines.

Databricks como o motor de modernização

A solução se concentrou em duas capacidades trabalhando juntas: o Genie Code com Agent Skills personalizados para gerar artefatos de ingestão prontos para produção, e um Databricks App para mapear campos de origem para tabelas lakehouse de destino e gerar lógica de transformação.

Juntos, eles criaram um fluxo de trabalho de ponta a ponta, desde a descoberta de metadados até o código gerado, tudo dentro do Databricks. O Genie Code atua como o parceiro autônomo de IA, enquanto um Agent Skill personalizado codifica os padrões de ingestão e a lógica de mesclagem da empresa. O Unity Catalog fornece introspecção de esquema nas camadas raw, histórica e de preparação (prep), enquanto o Databricks Apps oferece suporte à experiência de mapeamento de origem para destino. Os pipelines resultantes usam PySpark, Spark SQL e Delta Lake e são projetados para serem executados por meio do Lakeflow Jobs.

Essa abordagem permitiu que a equipe estendesse o Genie Code com seus próprios padrões de ingestão e convenções de pipeline. Convenções de auditoria, lógica de deduplicação, proteções de mesclagem por sequência de alteração (change-sequence merge guards), reconciliação de exclusão lógica (soft-delete) e padrões de teste são incorporados diretamente no processo de geração, em vez de depender de cada desenvolvedor para aplicá-los manualmente.

Adicionar determinismo a um fluxo de trabalho probabilístico é a chave. Escolhemos automatizar o que sabemos que está correto e deixamos a camada de interpretação opcional. O LLM ajuda enquanto você pensa. O framework garante que a explicabilidade seja integrada.—Dinesh Chandrasekaran, líder de dados e IA em uma empresa líder de transporte e logística do Canadá

Essa filosofia tornou-se central para toda a abordagem: usar IA onde o raciocínio e a descoberta são importantes, e usar padrões rígidos onde a consistência e a reprodutibilidade são mais importantes.

De um breve prompt a pipelines prontos para produção

Um desenvolvedor começa com um prompt YAML compacto. No caso mais simples, esse prompt pode ter apenas duas linhas para a ingestão bruta (raw). Para um pipeline de tabela completo, ele inclui entradas principais, como nomes de tabelas de origem e destino, chaves primárias, lógica de deduplicação e comportamento de atualização (refresh).

A partir daí, o Genie Code segue um fluxo de trabalho estruturado. Ele analisa e valida o prompt, descobre esquemas das camadas histórica e confiável por meio dos metadados do Unity Catalog, faz a correspondência automática de colunas com a origem, identifica requisitos de conversão de tipo (type-cast) e renomeação, resolve padrões de transformação, gera os artefatos solicitados usando os padrões da empresa e valida cada saída em relação aos invariantes corporativos exigidos. Esses invariantes incluem cobertura de chave primária, posicionamento de coluna de auditoria, mesclagens protegidas por sequência de alteração, deduplicação compatível com REFRESH e cobertura de suíte de testes.

Dependendo do modo, o fluxo de trabalho oferece suporte a uma única tabela, várias tabelas em uma única solicitação ou uma execução em lote (bulk) orientada por um arquivo CSV ou Excel armazenado em um volume do Unity Catalog. Na prática, o fluxo de trabalho pode gerar seis saídas prontas para produção: DDL, carregamento histórico, ingestão de streaming bruta (raw), primeira mesclagem incremental, mesclagem incremental contínua e uma suíte de testes automatizados.

Cada notebook gerado segue as mesmas convenções corporativas para colunas de auditoria, deduplicação, mesclagens baseadas em sequência de alteração e reconciliação de exclusão lógica (soft-delete).

Agent Skills tornaram os padrões corporativos reutilizáveis

Uma parte fundamental da arquitetura foi o Agent Skill personalizado, que oferece ao Genie Code uma maneira reutilizável de aplicar os padrões de ingestão, convenções de nomenclatura e padrões de pipeline da empresa.

O skill é versionado como qualquer outra base de código. Ele inclui um ponto de entrada SKILL.md e arquivos de padrão de suporte para descoberta de catálogo, convenções, ingestão bruta (raw), carregamentos históricos, mesclagens incrementais e geração de testes. Essa estrutura permite que a empresa mantenha sua lógica de geração de forma centralizada, ao mesmo tempo em que a disponibiliza para os desenvolvedores por meio do Genie Code.

O skill é uma única pasta carregada no workspace/.assistant/skills/lakehouse-ingestion/.


Ele contém um ponto de entrada SKILL.md mais sete arquivos de padrão, um por tipo de artefato:

O frontmatter SKILL.md é o que o Genie Code usa para decidir quando carregar o skill:

Em vez de documentar os padrões em um só lugar e pedir para cada desenvolvedor interpretá-los manualmente, a equipe codificou esses padrões no próprio fluxo de trabalho. O agente cuida da coleta de contexto e da orquestração. O skill garante que os artefatos gerados sigam os mesmos padrões todas as vezes.

Um desenvolvedor inicia a geração de código com um breve prompt YAML dentro de uma sessão do Genie Code. O mínimo são duas linhas apenas para a ingestão bruta (raw). Um pipeline completo leva seis.

Exemplo mínimo, gera apenas o notebook de ingestão bruta (raw):

Exemplo completo, gera o pipeline completo de seis artefatos para uma tabela:

Os seis artefatos são executados nesta ordem em tempo de execução:

Baseado no Unity Catalog, governado por padrão

Outro princípio fundamental de design foi basear a geração de código em metadados ativos, em vez de suposições estáticas.

O Genie Code usa o Unity Catalog para inspecionar esquemas em tabelas brutas, históricas e de preparação em tempo real. Essa abordagem orientada a metadados elimina a necessidade de uma camada de descoberta separada e fornece ao agente o contexto necessário para gerar mapeamentos, inferir transformações e validar campos obrigatórios antes que o código seja emitido.

Tão importante quanto, todos os artefatos gerados permanecem dentro do workspace do Databricks e operam sob o mesmo modelo de governança que o restante da plataforma de dados. Controles de acesso, políticas de metadados e histórico de revisões permanecem nativos do Databricks. Essa combinação de fundamentação em metadados e execução governada ajudou a equipe a fechar uma lacuna comum na adoção de AI empresarial: avançar mais rápido sem introduzir inconsistências ou enfraquecer os controles.

Human-in-the-loop onde importa

A empresa não tratou isso como um problema de geração totalmente automatizado e sem intervenção. Antes que o código seja gerado, os designers de dados usam um Databricks App para inspecionar como os campos dos sistemas de origem legados devem ser mapeados para as tabelas de destino do lakehouse.

Esta etapa, chamada de Mapeamento de Origem para Destino (Source-to-Target Mapping), captura a lógica de negócios que não deve ser adivinhada ou automatizada às cegas. Desenvolvido com Databricks Apps baseados em Streamlit, o aplicativo varre as tabelas do sistema de origem, preenche previamente os mapeamentos de colunas e permite que os designers de dados revisem e refinem a lógica de transformação no navegador.

Cada edição é rastreada em um registro de alterações, e o mapeamento final pode ser exportado e usado como entrada para o fluxo de trabalho de geração. Isso tornou o processo mais rápido sem remover a revisão de especialistas das partes do fluxo de trabalho onde a interpretação de negócios ainda é essencial. Os designers de dados puderam se concentrar na intenção de transformação e na lógica de negócios, enquanto o Genie Code e o framework de geração lidavam com padrões de implementação repetíveis.

Determinístico por design

Uma das decisões mais importantes na arquitetura foi manter a camada de raciocínio inteligente e adaptável, ao mesmo tempo em que tornava o código do pipeline emitido determinístico.

O Genie Code lida com as partes do fluxo de trabalho que se beneficiam do raciocínio agêntico: interpretar prompts, descobrir esquemas, selecionar o caminho de geração correto e costurar a sequência correta de ações. Mas o próprio código PySpark gerado é orientado por regras e reproduzível. Instruções de mesclagem, janelas de eliminação de duplicatas, posicionamento de colunas de auditoria, conversões de tipo e padrões de teste são todos definidos por meio de modelos explícitos e invariantes.

Para a empresa, isso era essencial. Na geração de pipelines de produção, pequenas variações na lógica de mesclagem, nas janelas de eliminação de duplicatas ou no posicionamento de colunas de auditoria podem criar riscos de qualidade de dados downstream. A emissão determinística tornou o sistema confiável o suficiente para ser usado em escala empresarial e consistente o suficiente para preservar padrões de engenharia conquistados com esforço.

Resultados: da produtividade do desenvolvedor à produtividade da modernização

O impacto foi imediato e prático:

  • Mais de 90% de automação para ingestão de novas tabelas no Databricks Lakehouse
  • Tempo de desenvolvimento de pipeline reduzido de dias por tabela para minutos
  • Suporte para modos de geração única, múltipla e em lote em solicitações ad hoc, migrações em lote e esforços de modernização em escala de sprint
  • Aplicação consistente de padrões corporativos em cada artefato gerado, sem a necessidade de revisão manual de conformidade

O que mudou não foi apenas a produtividade do desenvolvedor. A empresa aumentou a produtividade do próprio programa de modernização.

Em vez de tratar cada migração de tabela como um projeto de engenharia sob medida, a equipe criou um sistema repetível para traduzir ativos legados em pipelines de lakehouse governados em escala.

Olhando para o futuro

A empresa vê isso como a base para uma automação de modernização mais ampla. A equipe agora está explorando uma arquitetura de habilidades mais modular para orquestração, transformação, lógica de negócios e observabilidade; estendendo a descoberta além do Unity Catalog para o catálogo de dados corporativos mais amplo; avaliando a conversão assistida por AI de lógicas legadas do DataStage, COBOL e stored procedures para PySpark; e usando recursos emergentes de agentes em segundo plano para dar suporte à triagem rotineira de pipelines, atualizações de DBR e correção de incompatibilidades de esquema.

O objetivo de longo prazo vai além de uma geração de código mais rápida. É criar um modelo de modernização que se dimensione continuamente, mesmo à medida que a complexidade dos sistemas legados, a demanda de negócios e o escopo da plataforma continuem a crescer.

(Esta publicação no blog foi traduzida utilizando ferramentas baseadas em inteligência artificial) Publicação original

Receba os posts mais recentes na sua caixa de entrada

Assine nosso blog e receba os posts mais recentes diretamente na sua caixa de entrada.