O DataWorks oferece o nó for-each para iterar sobre o conjunto de resultados de um nó de atribuição e orquestrar fluxos de negócios. Este tópico descreve os componentes e a lógica desse nó.
Notas de uso
A tabela a seguir descreve como utilizar o nó for-each.
|
Descrição |
Referências |
|
Conheça os cenários de aplicação do nó for-each. |
Nota
Uso exclusivo para percorrer o conjunto de resultados retornado pelo nó de atribuição. |
|
Saiba mais sobre limites e observações do nó for-each, como número máximo de iterações, testes e visualização de logs. |
|
|
Personalize o fluxo de negócios dentro de um nó for-each. O fluxo deve começar com o nó Start integrado e terminar com o nó End integrado. |
|
|
Entenda como a saída do nó de atribuição upstream determina a quantidade de iterações do nó for-each. |
|
|
Veja como as variáveis integradas do nó for-each obtêm valores relevantes em cada iteração. |
|
|
Consulte exemplos de recuperação de valores de variáveis e cálculo do total de iterações. |
Exemplos de recuperação de valores quando o nó de atribuição upstream é Shell ou ODPS SQL |
Cenários
O nó for-each do DataWorks destina-se principalmente a cenários que exigem loops. Seu uso requer obrigatoriamente um nó de atribuição upstream. O nó for-each recebe a saída desse nó de atribuição e itera sobre os resultados.

Limites
O nó for-each tem suporte apenas no DataWorks Standard Edition e versões posteriores. Para mais detalhes, consulte Detalhes dos recursos por versão.
Um nó for-each aceita no máximo 1.024 iterações. A quantidade real de repetições corresponde ao tamanho do conjunto de resultados produzido pelo nó de atribuição.
Não há suporte para execução simultânea. Uma nova iteração só começa após a conclusão da anterior.
Observações
|
Dimensão |
Categoria |
Descrição |
|
Dependências upstream e downstream |
Configurações de dependência |
O nó for-each percorre os valores transmitidos por um nó de atribuição. Portanto, configure o nó de atribuição como upstream do for-each. |
|
Suporte a iterações |
Limite máximo de iterações |
O nó for-each suporta até 1.024 loops. Exceder esse limite gera erro em tempo de execução. A quantidade efetiva de loops segue a saída do nó de atribuição upstream. |
|
Quantidade de iterações |
Definida pelo conjunto de resultados gerado pelo nó de atribuição. |
|
|
Nós internos |
Orquestração de fluxo |
|
|
Recuperação de valores |
Variáveis integradas permitem extrair valores específicos do nó de atribuição upstream. |
|
|
Depuração e execução |
Depuração de tarefas |
|
|
Visualização de logs |
Para inspecionar o log de execução de um nó for-each no Operation Center, clique com o botão direito na instância e selecione View Inner Nodes para acessar os logs dos nós internos. |
Componentes do nó e orquestração de fluxo
No DataWorks, o nó for-each é um tipo especial de nó que encapsula outros nós internos. Ao criar um nó for-each, o sistema gera automaticamente três nós internos: um Start node (início do loop), um Shell node (tarefa do loop) e um End node (fim do loop). Esses nós formam um fluxo interno que itera sobre a saída do nó de atribuição upstream.
Conforme ilustra a figura anterior:
-
Shell node
Por padrão, o DataWorks cria um nó interno Shell para executar tarefas. Caso prefira, exclua o Shell node padrão e configure um nó personalizado para a tarefa de iteração do loop.
Se a tarefa de iteração for do tipo Shell, dê um clique duplo no Shell node para abrir o editor de código e desenvolver a lógica da tarefa.
-
Para tarefas de iteração mais complexas, adicione outros nós de tarefa ao fluxo interno e reestruture o processo de execução conforme necessário.
NotaAo personalizar o nó de tarefa do loop, remova as dependências existentes entre os nós internos e reorquestre o fluxo interno. Lembre-se de que o Start node e o End node devem ocupar, respectivamente, a primeira e a última posição no fluxo interno.
-
Start node e End node
Esses nós marcam o início e o fim de cada ciclo no fluxo interno e não contêm código de tarefa específico.
NotaO End node de um nó for-each não controla a quantidade de loops. Esse número deriva exclusivamente da saída do nó de atribuição upstream.
Número de iterações
Um nó for-each aceita no máximo 1.024 iterações. A quantidade real de repetições corresponde ao tamanho do conjunto de resultados produzido pelo nó de atribuição.
O total de iterações varia conforme o conjunto de resultados gerado pelo nó de atribuição:
-
Iterações com Shell e Python: A saída consiste em um array unidimensional. O número de loops equivale à quantidade de elementos nesse array, separados por vírgulas.
Por exemplo, se a linguagem de atribuição for Shell ou Python (Python 2) e a saída for o array unidimensional
2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01, o nó for-each executará cinco iterações. -
Iterações com SQL: A saída é um array bidimensional. O número de loops corresponde à quantidade de linhas desse array.
Considere, por exemplo, um nó de atribuição em ODPS SQL cuja saída seja o seguinte array bidimensional:
+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | Hubei Province | 30-40 years old | Cancer | | 0016359814159 | Unknown | 30-40 years old | Cancer | +----------------------------------------------+Nesse caso, o nó for-each realizará duas iterações.
Variáveis integradas
Nos nós internos de um for-each, utilize os métodos abaixo para acessar o conjunto de resultados do nó de atribuição upstream. Se o fluxo interno já contiver um nó de atribuição, aplique o método padrão de recuperação de valores para nós downstream. Para detalhes sobre esse método, consulte Nó de atribuição.
Durante a iteração do nó for-each sobre a saída de um nó de atribuição, use variáveis integradas para obter o número da iteração atual e o deslocamento (offset).
|
Variável integrada |
Descrição |
Equivalência em um loop for |
|
|
Retorna o conjunto de dados do nó de atribuição. |
Corresponde ao seguinte trecho em um loop for:
|
|
|
Obtém o valor da iteração atual. |
Tomando como base o loop for abaixo:
|
|
|
Representa o deslocamento atual (posição da iteração em relação à primeira). |
|
|
|
Indica o número da iteração corrente. |
- |
Caso conheça o schema da tabela de saída, utilize as variáveis adicionais listadas a seguir para recuperar outros valores.
|
Outra variável |
Descrição |
|
|
Quando a saída do nó de atribuição upstream for um array bidimensional, recupera os dados de uma coluna específica na linha atual de cada iteração. |
|
|
Para saídas em formato de array bidimensional, acessa o dado localizado na linha i e coluna j do conjunto de dados. |
|
|
Se a saída do nó de atribuição upstream for um array unidimensional, retorna o elemento no índice especificado. |
Exemplos de uso das variáveis integradas
Exemplo 1: Nó de atribuição upstream do tipo Shell
-
Saída do nó de atribuição
O nó de atribuição upstream é do tipo Shell. A saída final corresponde a
2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01. -
Recuperação de valores no nó for-each
NotaComo a saída é um array unidimensional com cinco elementos separados por vírgula, o nó for-each executa cinco iterações.
Variável integrada
Valor na 1ª iteração
Valor na 2ª iteração
${dag.loopDataArray}2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01${dag.foreach.current}2021-03-282021-03-29${dag.offset}0
1
${dag.loopTimes}1
2
${dag.foreach.current[3]}2021-03-30
Exemplo 2: Nó de atribuição upstream do tipo ODPS SQL
-
Saída do nó de atribuição
O nó de atribuição upstream utiliza ODPS SQL. A última instrução select retorna dois registros:
+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | Hubei Province | 30-40 years old | Cancer | | 0016359814159 | Unknown | 30-40 years old | Cancer | +----------------------------------------------+ -
Recuperação de valores no nó for-each
NotaVisto que a saída é um array bidimensional com duas linhas, o nó for-each realiza duas iterações.
Variável integrada
Valor na 1ª iteração
Valor na 2ª iteração
${dag.loopDataArray}+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | Hubei Province | 30-40 years old | Cancer | | 0016359814159 | Unknown | 30-40 years old | Cancer | +----------------------------------------------+${dag.foreach.current}0016359810821,Hubei Province,30-40 years old,Cancer0016359814159,Unknown,30-40 years old,Cancer${dag.offset}0
1
${dag.loopTimes}1
2
${dag.foreach.current[0]}00163598108210016359814159${dag.loopDataArray[1][0]}0016359814159