iterador¶
controle
executa um sub-fluxo (loop body) para cada linha de uma tabela upstream — o nó de repetição da plataforma, usado quando uma etapa do pipeline precisa rodar uma vez por item de uma lista (ex: uma chamada de api por cliente).
quando usar¶
- chamar uma api uma vez por registro (ex: buscar detalhes de cada pedido individualmente, quando a api não oferece um endpoint em lote)
- processar arquivos ou tabelas por item de uma lista de configuração (ex: uma tabela por schema, uma extração por filial)
- lidar com fontes que exigem paginação por item específico em vez de paginação nativa do conector
como funciona¶
o iterador é um container no canvas: você arrasta outros nós para dentro dele, formando o "corpo do loop". para cada linha da tabela que chega ao iterador, a plataforma executa esse sub-fluxo uma vez, injetando os valores da linha atual como variáveis de pipeline ({{ pipeline.row.<coluna> }}).
os resultados de cada iteração são acumulados progressivamente em um único dataset de saída, conforme o modo de chunking configurado.
[fonte: lista de clientes]
↓
┌─── iterador ─────────────────────┐
│ [auth rest]* → [api rest: detalhes do cliente] │
└───────────────────────────────────┘
↓ (resultados acumulados)
[coletor / fábrica / lakehouse writer]
* opcional — apenas quando a api exige reautenticação periódica
configuração¶
| campo | tipo | obrigatório | descrição |
|---|---|---|---|
chunk_mode |
enum | não | none, rows ou size_mb — ver chunking · padrão: none |
chunk_rows |
number | condicional | linhas acumuladas antes de liberar memória · usado quando chunk_mode = rows |
chunk_size_mb |
number | condicional | tamanho estimado (mb) antes de liberar memória · usado quando chunk_mode = size_mb |
chunk_check_interval |
number | não | a cada quantas iterações o tamanho é verificado (modo size_mb) · padrão: 50 |
persist_table |
string | sim | nome base usado para identificar o resultado do iterador |
compression |
enum | não | snappy, zstd ou gzip · padrão: snappy |
fail_on_item_error |
bool | não | se true, um erro em qualquer item interrompe o pipeline inteiro · padrão: false |
max_errors |
number | não | número máximo de erros tolerados antes de abortar a iteração |
chunking para fontes grandes¶
quando a lista de itens é muito grande (milhares a milhões de linhas), manter tudo em memória até o fim não é viável. o chunk_mode controla quando os resultados acumulados são liberados:
| modo | comportamento |
|---|---|
none |
mantém tudo em memória até o final — adequado para listas pequenas/médias |
rows |
libera a cada chunk_rows linhas acumuladas |
size_mb |
libera quando o tamanho estimado ultrapassa chunk_size_mb, verificado a cada chunk_check_interval iterações |
exemplo¶
{
"chunk_mode": "rows",
"chunk_rows": 5000,
"persist_table": "detalhes_pedidos",
"compression": "zstd",
"fail_on_item_error": false,
"max_errors": 50
}
processa a lista de origem item a item, liberando memória a cada 5.000 linhas acumuladas, e tolera até 50 erros individuais antes de abortar a execução.
tratamento de erros¶
fail_on_item_error: false(padrão) — um erro em um item específico é registrado no log e a iteração continua para os demais itensfail_on_item_error: true— qualquer erro interrompe o pipeline inteiro imediatamentemax_errors— funciona como um limite de tolerância: mesmo comfail_on_item_error: false, a iteração é abortada se o total de erros atingir esse número
reautenticação dentro do loop¶
quando a api chamada dentro do loop exige tokens de curta duração, coloque um nó auth rest no início do corpo do iterador. se o nó auth rest tiver expires_in_field ou token_expiry_field configurado, a reautenticação só é refeita quando o token realmente expira — não a cada iteração.
iterador vs. coletor¶
o iterador executa o loop; o coletor consolida resultados de múltiplos nós que rodaram dentro (ou em paralelo a) iterações — os dois costumam ser usados juntos em fluxos mais elaborados.
modo de amostra
ao testar o pipeline no builder, o iterador executa apenas uma iteração (mesmo que a fonte tenha milhares de linhas), o suficiente para validar a configuração do loop body sem rodar o processo inteiro.