dbt
JuniorPor que minha macro do dbt compila para algo completamente diferente do que eu esperava?
Uma macro é um template, não o SQL que roda. Depurar o template em vez do que ele realmente produziu é depurar a camada errada por completo.
A macro lê certinho. O SQL compilado não se parece nada com o que a macro diz - e essa diferença quase sempre se resume a um de três comportamentos específicos do Jinja, não um bug do dbt.
Leia o SQL compilado, não a macro
O dbt compile grava o SQL totalmente renderizado de cada modelo em target/compiled/ - esse arquivo, não o template Jinja, é a verdadeira fonte da verdade do que a macro realmente produziu. Ficar olhando o código-fonte da macro e raciocinando sobre o que ela deveria produzir é depurar uma camada diferente da que realmente roda.
O controle de espaço em branco muda o que o Jinja considera código
{%- ... -%} corta o espaço em branco e as quebras de linha bem ao redor de uma tag. Deixar esses traços de fora dentro de um loop ou condicional numa macro é a razão mais comum pela qual o SQL compilado sai com linhas em branco perdidas, ou pior, com uma vírgula sobrando deixada por uma iteração do loop que não cortou do jeito que parecia que cortaria.
O escopo de variável dentro de uma macro não é o que parece
Uma variável definida com {% set x = ... %} dentro de um loop {% for %} não persiste fora do escopo daquele loop como uma variável comum faria na maioria das linguagens - esse é um comportamento rotineiro do Jinja, não uma peculiaridade específica do dbt, e o jeito usual de consertar quando uma macro precisa acumular um valor através das iterações do loop é um objeto namespace() em vez de um set simples.
Veja como isso fica no seu próprio pipeline.
Envie um event log real do Spark, um run_results.json do dbt ou uma exportação de métricas do Flink e receba recomendações concretas, para aprovar antes de aplicar - não mais uma regra geral.