

O iFood se destaca como uma organização data-driven, onde os desenvolvimentos de produtos e as tomadas de decisões estratégicas são fundamentadas em dados. Para sustentar esse padrão de excelência, é essencial proporcionar aos engenheiros, analistas e cientistas a autonomia necessária para criar e gerenciar suas próprias soluções, promovendo assim uma cultura de inovação e autogestão analítica.
Com esta liberdade, surgem desafios interessantes como o de lidar com a produção e gestão de dados redundantes. Sem um monitoramento eficaz das tabelas do Data Lake (DL), este problema pode resultar em custos desnecessários de processamento e armazenamento, além de aumentar a complexidade do parque de dados.
Na tentativa de identificar e mitigar estas ineficiências, buscamos na literatura algumas possibilidades e acabamos adotando e adaptando o algoritmo proposto por Raunak Shah et al. no artigo “R2D2: Reducing Redundancy and Duplication in Data Lakes“. O trabalho traz uma abordagem inovadora e principalmente barata, do ponto de vista computacional, a qual constrói e refina grafos relacionais entre datasets para identificar tabelas com dados potencialmente redundantes, destacando oportunidades de ganho e simplificação do ambiente de dados corporativo.
O algoritmo original é composto pelo encadeamento de três etapas capazes de entregar, como produto final, um mapa de relações entre pares de tabelas cujos dados são potencialmente duplicados. A cada etapa aplicada, seu resultado serve de insumo para a próxima, a qual refina e entrega um conjunto de pares de tabelas mais assertivo que aquele obtido pela etapa anterior. Resumidamente, as etapas são:
➢ Etapa “Schema Graph Builder (SGB)” — Este componente basicamente compara schemas entre tabelas colunares e determina quais são aqueles coincidentes ou que possuem alguma relação de contenção. Por exemplo, se uma tabela A possui todas as colunas da tabela B, isto pode indicar que A contém potencialmente todos os dados de B, tornando B uma fonte de informações duplicadas (portanto, sem necessidade de existência). E estas relações são representadas em forma de grafo.
O SGB utiliza uma abordagem inteligente de clustering para evitar comparações custosas O(N²) entre todas as tabelas. O algoritmo funciona da seguinte forma:
1. Ordenação: As tabelas são ordenadas por cardinalidade de schema (número de colunas) em ordem decrescente;
2. Formação de clusters: Percorre-se a lista ordenada e, para cada schema:
3. Construção do grafo: Dentro de cada cluster, são criadas arestas direcionadas entre pares de tabelas onde existe contenção real, sempre apontando da tabela maior para a menor.

Esta estratégia garante que nenhuma relação de contenção seja perdida, enquanto mantém a complexidade computacional em O(N log N) + O(K(N-K)), onde K é o número de clusters formados — muito mais eficiente que a abordagem de comparar todas as tabelas entre si.
➢ Etapa “Min-Max Pruning (MMP)” — Após a criação do grafo, remove-se algumas conexões (filtragem) com base nos valores mínimos e máximos entre colunas comuns do tipo numéricas. O princípio aplicado é que, se um conjunto de dados A está contido em B, para todas as colunas comuns numéricas, então:
1. O valor mínimo na coluna de A deve ser maior ou igual ao valor mínimo na coluna de B.
2. O valor máximo na coluna de A deve ser menor ou igual ao valor máximo na coluna de B.
Se alguma destas condições for violada, o algoritmo MMP remove a conexão entre os conjuntos de dados no grafo, indicando que a contenção não é possível.
➢ Etapa “Content Level Pruning (CLP)” — Nesta fase, o algoritmo ajusta as relações nos grafos (nova filtragem) examinando os dados das tabelas em si, em nível granular de linha.
O CLP utiliza técnicas de amostragem para decidir se as conexões (ou relacionamentos de contenção potenciais entre datasets) devem ser mantidas ou excluídas. Se o conjunto A está totalmente contido em B, esta relação de contenção deve ser válida mesmo para subconjuntos amostrados de A. Ao consultar subconjuntos específicos de A, e verificar sua presença em B, o algoritmo assegura uma inferência precisa de contenção sem precisar varrer tabelas inteiras.
Esta abordagem SGB ⇒ MMP ⇒ CLP demonstrou resultados satisfatórios nos estudos de caso realizados no artigo. Contudo, considerando o contexto específico do iFood e a realidade de uma empresa que lida diariamente com Data & IA em larga escala, identificamos algumas adaptações necessárias para melhor atender ao cenário operacional e às características do nosso DL. Importante: sem deixar de lado a premissa original de compor uma solução eficiente e de baixo custo.
Os principais desafios que motivaram estas adaptações incluem:
Reformulamos o algoritmo original e substituímos as etapas MMP e CLP por duas novas etapas com o mesmo objetivo de filtragem e refinamento incremental do resultado, mas trazendo a realidade das tecnologias do iFood para o jogo e dando nossa assinatura à solução.
Buscamos preservar e/ou aumentar a precisão e relevância dos resultados e eliminando ao máximo falsos positivos. A imagem abaixo ilustra o algoritmo construído, numa abordagem que batizamos de SGB ⇒ DLP ⇒ LTP.

Mantivemos este componente inalterado pois ele oferece a garantia fundamental de 100% de detecção de relações de contenção entre schemas. O SGB continua sendo nossa base sólida para identificar todas as possíveis relações hierárquicas entre tabelas com base nas suas concepções colunares.
Introduzimos uma filtragem por contexto que permite direcionar o algoritmo para áreas específicas do Data Lake, reservando a potencialidade e assertividade da identificação de informações redundantes a nichos conhecidos e descartando naturalmente redundâncias inerentes a processos internos:
Aproveitamos de um poderoso recurso presente no nosso DL conhecido como Data Lineage e implementamos uma validação por linhagem para eliminar falsos positivos resultantes de coincidências entre schemas:
Com o protótipo do algoritmo em mãos, chegou o momento de colocá-lo à prova. No lugar de partir direto para uma implementação em ampla escala, adotamos uma abordagem mais estratégica e direcional: selecionamos um Domínio de Negócio específico para servir como nosso laboratório de validação. E o time de Fintech topou a parceria!
Nosso objetivo foi para além de simplesmente medir a taxa de assertividade do algoritmo. Queríamos compreender como os especialistas do domínio perceberam nossa solução e quais insights eles poderiam oferecer para aprimorá-la.
Os números falaram por si: de 76 pares de tabelas identificadas como tendo uma potencial relação de duplicidade, 60 delas realmente refletiam informações totalmente redundantes entre si!!! Isto representa aproximadamente 79% de assertividade do algoritmo. Para um primeiro teste, este resultado superou algumas expectativas daquelas mais otimistas.
Destes 60 pares, um total de 30 tabelas puderam ser identificadas como duplicatas e, após sua auditoria detalhada, os especialistas do domínio já puderam tomar ações concretas de limpeza. Os demais pares identificados também envolviam tabelas cujos schemas, linhagens e contextos estavam correlacionados, porém constituíam sub amostragens dos dados umas das outras, por vezes construídas por questões de otimização de processos de leitura de grandes datasets. Apesar de não serem datasets puramente duplicados, abriu-se oportunidade para revisitar e questionar sua real necessidade.
Curiosidade Técnica: desde a construção do grafo primário de relações de duplicidade (etapa SGB) até a filtragem com base no pertencimento à linhagem (etapa LTP), o algoritmo varre todo o Data Lake. Isto envolve mais de 15 mil tabelas com volumetria de algumas centenas de Terabytes!!! Apesar disso, pela natureza hábil da sua construção, este processo leva em torno de 10 minutos numa infraestrutura tímida (alguns poucos workers Spark em instâncias small sized).
Este primeiro resultado teve um efeito transformador na percepção do projeto. A confiança gerada pelos números abriu caminho para duas expansões importantes para torná-lo uma solução robusta e escalável para a companhia:
Nossa solução de automação foi estruturada em três fases principais, cada uma com responsabilidades bem definidas:
O coração do sistema reside no algoritmo principal que executa sequencialmente as três etapas essenciais:
Este processo é orquestrado via Airflow, que garante execução periódica, resiliente e confiável do pipeline. O resultado de cada execução é persistido no Data Lake, criando um histórico rastreável de todas as detecções de potenciais duplicidades.
Um segundo componente, também orquestrado via Airflow, consome os resultados da análise de redundância e traduz os insights técnicos em sugestões de ações efetivas.
Utilizando um bot personalizado junto ao principal comunicador adotado pela empresa, o sistema notifica diretamente os proprietários e responsáveis pelas tabelas identificadas como potencialmente redundantes, orientando-os com metadados e facilitando como identificá-las, acessá-las e avaliá-las.
Em vez de simplesmente informar sobre o problema, oferecemos aos responsáveis notificados opções claras de ação num canal direto para acionamento via comunicador (como, por exemplo, a remoção imediata das tabelas, a inclusão das mesmas em listas de exceção — quando a duplicação é intencional ou necessária, a sugestão de alinhamento entre times para otimização/convergência/redução de datasets essenciais, etc).
Apesar dos resultados positivos, permanecemos continuamente com o foco em tornar a solução ainda mais eficiente e inteligente. Já identificamos áreas específicas para aprimoramento futuro do algoritmo, dentre elas:
O algoritmo atualmente exige correspondência exata de nomenclatura entre colunas, o que pode deixar de fora alguns casos de relações de duplicidade como consequência de erros de digitação, descontinuidade de padrão no ciclo de vida do dado pós-transformação, etc . Em pipelines produtivos, é comum encontrar tabelas da mesma linhagem com colunas idênticas que foram renomeadas para adequação a processos específicos (ex: customer_id vs. client_id). Essas tabelas, apesar de semanticamente equivalentes, não são detectadas pela atual etapa SGB.
Quando duas tabelas possuem exatamente as mesmas colunas, o algoritmo cria uma relação bidirecional (A ⊆ B e B ⊆ A, simultaneamente). Essa situação, embora tecnicamente correta, pode gerar confusão na interpretação dos resultados, exigindo uma análise mais detalhada de qual tabela deve ser removida ou mantida. Este aspecto nos desperta a intenção de adotar soluções em DataViz que cumpram melhor este papel e ilustrem relações em grafos de forma mais inteligível.
Após algumas PoCs (Proof of Concept), identificamos o potencial da inclusão de uma nova camada adicional de validação semântica após o filtro por linhagem. Esta etapa incorpora à solução, para além dos schemas, outras fontes extras de metadados e principalmente os códigos-fonte das ETLs por trás das tabelas envolvidas. Sob esta ótica, temos:
Tais melhorias elevam o algoritmo ao patamar de uma solução que combina análise estrutural com compreensão semântica, aumentando significativamente sua precisão a um custo que conserva sua premissa de entregar um caminho inovador e barato para conservação de um Data Lake saudável.
Nossa adaptação do algoritmo R2D2 demonstrou que é possível gerar valor real adaptando pesquisa acadêmica ao contexto corporativo. Com 79% de assertividade numa primeira aplicação piloto detectando potenciais tabelas redundantes, evoluímos de um experimento controlado e deveras manual para uma solução automatizada completa, com aplicação em todo contexto de Dados do iFood. Esta solução entrega hoje a potencialidade de mantermos nosso Data Lake mais saudável, mais eficiente e reduzido de informações redundantes desnecessárias.
Substituímos componentes complexos e de maior custo, existentes na solução original, por equivalentes mais leves e mais inteligentes, baseados em filtragem direcionada ao contexto do negócio e incorporando recurso poderoso de Data Lineage. Esta abordagem reduziu com segurança falsos positivos e se alinharam à nossa realidade tecnológica com mínimo esforço.
As oportunidades de melhoria identificadas — flexibilidade de schemas, tratamento de relações simétricas e validação semântica por LLM — apontam para uma próxima iteração ainda mais precisa e inteligente.
R2D2: Reducing Redundancy and Duplication in Data Lakes [2023]; Raunak Shah et al.; Proceedings of the ACM on Management of Data, Volume 1, Issue 4 (DOI: https://doi.org/10.1145/3626762 — alternative: arXiv:2312.13427)
Texto escrito em parceria com
Rafael Mattos, engenheiro de dados & IA no iFood.
We are always looking for passionate developers, designers and data scientists to help us revolutionize the food delivery experience. Join iFood Tech and be part of building the future of food technology.
Discover our Careers
How iFood's generative AI connects personalization and communication through rigorous engineering patterns to scale unique user experiences From Grouped Campaigns to Individual Decisions [4:30 PM, Tuesday] Haven't had lunch yet, right? The Mushroom Risotto you love is waiting for you…



In a microservices ecosystem as dynamic and complex as iFood's, ensuring that people and systems have appropriate access to the right resources is a constant challenge. Historically, in most cases, authorization logic is implemented in a decentralized and inconsistent manner…


In this publication, we present how iFood benefited from using a Features Platform, which in addition to simplifying feature management, also provided a robust, efficient infrastructure and mitigated latency problems previously faced in fraud detection and combat. The digital revolution…

Each article is the result of the vision and expertise of our authors. See who contributes to our blog: