DataWorks ofrece el nodo do-while para ejecutar un conjunto de tareas en bucle. Es posible orquestar la lógica de negocio dentro de este nodo y utilizar su nodo end interno para definir la condición de salida. El nodo do-while se puede usar de forma independiente o junto con un nodo de asignación para iterar sobre el conjunto de datos que este último transmite. Este tema describe los componentes y la lógica de aplicación del nodo do-while.
Contexto
A continuación se presenta una descripción general de este tema.
|
Descripción |
Referencias |
|
Límites y precauciones para los nodos do-while, incluido el número máximo de iteraciones, métodos de prueba y visualización de registros. |
|
|
Personalización del flujo de trabajo interno, que debe comenzar con el nodo start integrado y terminar con el nodo end integrado. |
|
|
Uso de variables integradas para obtener parámetros de bucle, con ejemplos de recuperación de valores. |
|
|
Cómo el nodo end controla la salida del bucle, con muestras de código. |
|
|
Revise los casos de uso típicos del nodo do-while. |
Use case 1: Use with an assignment node y Use case 2: Use with branch and merge nodes |
Límites
El nodo do-while solo está disponible en DataWorks Standard Edition y versiones posteriores. Para más información, consulte DataWorks editions and features.
Un nodo do-while puede realizar un máximo de 1,024 iteraciones.
No se admite la ejecución paralela. Una nueva iteración solo puede comenzar después de que finalice la anterior.
Precauciones
Dimensión | Elemento | Descripción |
Compatibilidad con bucles | Número máximo de iteraciones | Un nodo do-while puede realizar un máximo de 1,024 iteraciones. Si el número de iteraciones controlado por el nodo end supera las 1,024, el nodo reporta un error. |
Nodos internos | Orquestación del flujo de trabajo |
|
Recuperación de valores | El nodo proporciona built-in variables para recuperar valores específicos de un nodo de asignación ascendente. | |
Depuración | Depuración de tareas | En espacios de trabajo en modo estándar, no es posible probar un nodo do-while directamente en DataStudio. En su lugar, debe enviar la tarea que contiene el nodo al entorno de desarrollo y ejecutarla en Operation Center. |
Visualización de registros | Para consultar los registros de ejecución de un nodo do-while en Operation Center, haga clic con el botón derecho en la instancia y seleccione View Inner Nodes. | |
Dependencias | Configuración de dependencias | Un nodo do-while se puede usar de forma independiente o junto con un nodo de asignación. No obstante, al realizar un backfill de datos en Operation Center, debe seleccionar ambos nodos para su ejecución. Ejecutar únicamente el nodo do-while impide que reciba valores del nodo de asignación. |
Componentes y orquestación del flujo de trabajo
Un nodo do-while es un nodo contenedor especial que alberga un flujo de trabajo interno. Al crear un nodo do-while, se generan automáticamente tres nodos internos: un nodo start (inicio del bucle), un nodo shell (tarea del bucle) y un nodo end (condición de fin del bucle). Estos nodos internos se organizan en un flujo de trabajo para la ejecución iterativa de tareas.
-
Nodo start
Marca el inicio del bucle. No contiene código de tarea y no se puede eliminar. Todos los demás nodos del bucle deben depender del nodo start, ya sea directa o indirectamente.
-
Lógica del bucle
De forma predeterminada, DataWorks crea un nodo shell interno para la tarea del bucle. Puede eliminar el nodo shell predeterminado y construir un flujo de trabajo de negocio personalizado dentro del bucle.
Por lo general, el flujo de trabajo del bucle se usa junto con un nodo de asignación, un nodo de rama o un nodo de fusión. Al personalizar las tareas del bucle, puede eliminar dependencias entre nodos internos y reorganizar el flujo de trabajo. Sin embargo, el flujo debe comenzar con el nodo start y terminar con el nodo end.
-
Nodo end
El nodo end define la condición de bucle para el nodo do-while. Funciona de manera similar a un nodo de asignación, y genera como resultado
truepara continuar con la siguiente iteración ofalsepara finalizarla.Puede escribir el código de la condición de bucle para el nodo end mediante ODPS SQL, Shell o Python 2. El nodo do-while proporciona variables integradas para simplificar este código. Para más información sobre las variables integradas, consulte Built-in variables y Value retrieval examples. Para ver muestras de código en diferentes lenguajes, consulte Sample code: Exit a loop by using the end node.
Todos los nodos dentro del bucle deben ser ascendentes respecto al nodo end, el cual no se puede eliminar.
Variables integradas
Un nodo do-while utiliza el formato ${dag.variable_name} para recuperar variables. DataWorks proporciona dos variables integradas del sistema: ${dag.loopTimes} y ${dag.offset}. También puede usar el nodo do-while junto con un nodo de asignación y emplear el formato ${dag.variable_name} para recuperar valores de los parámetros de asignación.
-
Variables integradas del sistema
En cada iteración del bucle, puede usar variables integradas para obtener el número de iteración actual y el desplazamiento.
Variable integrada
Descripción
Valor
${dag.loopTimes}El número de iteración actual.
El valor es 1 para la primera iteración, 2 para la segunda, 3 para la tercera, y así sucesivamente, hasta n para la enésima iteración.
${dag.offset}El desplazamiento.
El valor es 0 para la primera iteración, 1 para la segunda, 2 para la tercera, y así sucesivamente, hasta n-1 para la enésima iteración.
-
Recuperación de resultados de un nodo de asignación
Si utiliza un nodo do-while con un assignment node, también puede recuperar los valores de los parámetros de la asignación.
NotaCuando un nodo do-while depende de un nodo de asignación, puede establecer los parámetros de salida del nodo de asignación como los Input Parameters del nodo do-while. Esto permite que el nodo do-while recupere el conjunto de resultados del nodo de asignación y una fila específica dentro de dicho conjunto. El formato es ${dag.variable_name}, donde variable_name debe configurarse como uno de los Input Parameters del nodo do-while. El ejemplo en este tema define el parámetro
input(un Input Parameters) en el nodo do-while para recibir el conjunto de resultados del nodo de asignación. En la práctica, debe reemplazar esto con el nombre real de su parámetro.Variable integrada
Descripción
${dag.input}El conjunto de datos transmitido desde el nodo de asignación ascendente.
${dag.input[${dag.offset}]}Recupera la fila de datos correspondiente a la iteración actual.
${dag.input.length}Recupera la longitud del conjunto de datos.
Ejemplos de recuperación de valores
El formato del conjunto de resultados de un nodo de asignación depende de su lenguaje. Para recuperar resultados de un nodo de asignación basado en Shell, utilice un arreglo unidimensional. Para un nodo de asignación basado en ODPS SQL, utilice un arreglo bidimensional. Para más información, consulte assignment node.
Ejemplo 1: Nodo de asignación Shell
-
Salida del nodo
El nodo de asignación ascendente utiliza sintaxis Shell, y su última salida es
2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01. -
Valores de las variables
Variable integrada
Valor en la iteración 1
Valor en la iteración 2
${dag.input}2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01${dag.input[${dag.offset}]}2021-03-282021-03-29${dag.input.length}5
${dag.loopTimes}1
2
${dag.offset}0
1
Ejemplo 2: Nodo de asignación ODPS SQL
-
Salida del nodo
El nodo de asignación ascendente utiliza sintaxis ODPS SQL, y la última sentencia SELECT devuelve dos filas:
+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | Hubei Province | 30-40 years old| Cancer | | 0016359814159 | Unknown | 30-40 years old| Cancer | +----------------------------------------------+ -
Valores de las variables
Variable integrada
Valor en la iteración 1
Valor en la iteración 2
${dag.input}+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | Hubei Province | 30-40 years old| Cancer | | 0016359814159 | Unknown | 30-40 years old| Cancer | +----------------------------------------------+${dag.input[${dag.offset}]}0016359810821,Hubei Province,30-40 years old,Cancer0016359814159,Unknown,30-40 years old,Cancer${dag.input.length}2
NotaLa longitud del conjunto de datos corresponde al número de filas en el arreglo bidimensional.
${dag.input[0][1]}NotaEl valor en la primera fila y segunda columna del arreglo bidimensional.
Hubei Province
${dag.loopTimes}1
2
${dag.offset}0
1
Muestras de código del nodo end
Puede escribir el código para el nodo end en ODPS SQL, Shell o Python 2. Esta sección proporciona muestras de código para cada lenguaje.
ODPS SQL
SELECT CASE
WHEN COUNT(1) > 0 AND ${dag.offset}<= 9
THEN true
ELSE false
END
FROM xc_dpe_e2.xc_rpt_user_info_d where dt='20200101';
En este ejemplo, el código del nodo end limita el número total de iteraciones al comparar el recuento de filas de la tabla y el desplazamiento del bucle con valores fijos.
Shell
if [ ${dag.loopTimes} -lt 5 ];
then
echo "True"
else
echo "False"
fi
Este código compara el número de iteración actual, ${dag.loopTimes}, con 5 para limitar el número total de iteraciones.
Por ejemplo, ${dag.loopTimes} es 1 para la primera iteración y 2 para la segunda. Cuando su valor alcanza 5 en la quinta iteración, la condición se vuelve falsa, el nodo end genera False como salida y el bucle termina.
Python 2
if ${dag.loopTimes}<${dag.input.length}:
print True;
else
print False;
# If the end node outputs True, the next loop starts.
# If the end node outputs False, the loop terminates.
Este código limita el número de iteraciones al comparar el número de iteración actual (${dag.loopTimes}) con la longitud del conjunto de datos proveniente del nodo de asignación.
Casos de uso
Nodo de asignación
A continuación se describe un escenario típico y las precauciones para usar un nodo do-while con un assignment node.
Escenario | Configuración | Paso de parámetros |
Si un nodo interno dentro de un |
| En los Output Parameters del nodo de asignación, se agrega de forma predeterminada un parámetro llamado |
Nodos de rama y fusión
A continuación se describe un escenario típico y las precauciones para usar un nodo do-while con un branch node y un merge node.
|
Caso de uso |
Precaución |
|
Para realizar juicios lógicos o iterar sobre resultados dentro de un nodo do-while, utilice un nodo de rama (como |
Dentro de un nodo do-while, un nodo de rama (como |