DataWorks ofrece el nodo do-while, que implementa una lógica de bucle del tipo "ejecutar primero y comprobar después". Este nodo es ideal cuando necesita repetir una serie de tareas hasta que se cumpla una condición dinámica. Por ejemplo, sirve para sondear la existencia de un archivo o procesar datos por lotes hasta vaciar el origen. Puede orquestar un flujo de tareas dentro del cuerpo del bucle y usar un nodo End dedicado para controlar la salida del ciclo.
Escenarios de uso
En el desarrollo de datos, el nodo do-while simplifica el diseño de flujos de trabajo que necesitan ejecutar tareas repetidamente según una condición. Entre los escenarios más comunes se encuentran:
Sondeo de API: llama a una API de forma repetida hasta que devuelva un estado específico, como
SUCCESS, o hasta que los datos de respuesta cumplan con sus requisitos.Comprobación de disponibilidad de datos: espera a que se genere un archivo o una partición de datos ascendente. El bucle busca los datos en cada iteración y sale en cuanto están disponibles, lo que activa las tareas descendentes.
Procesamiento de datos por lotes: procesa una lista de elementos, como nombres de tablas o particiones de fecha, proporcionada por un nodo ascendente (por ejemplo, un nodo de asignación). El nodo do-while recorre la lista y procesa un elemento a la vez hasta agotarla.
Sincronización de estados: comprueba repetidamente el estado de un servicio externo. Cuando el estado cambia al valor deseado, como "Available" o "Complete", el bucle termina y activa el flujo de trabajo posterior de sincronización o procesamiento de datos.
Notas de uso
Requisitos de versión: disponible únicamente en DataWorks Standard Edition y versiones posteriores.
Permisos: su cuenta de RAM debe estar agregada al workspace de destino y contar con el rol de developer o workspace administrator. Para obtener más información, consulte Add members to a workspace.
Funcionamiento
El nodo do-while funciona como un contenedor de bucle basado en el mecanismo "ejecutar primero y comprobar después".
Nodo Start → cuerpo del bucle (ejecución de tareas) →
Nodo End (evaluación de la condición)
Inicio y ejecución: el bucle comienza en el nodo
. Todas las tareas del cuerpo del bucle se ejecutan como mínimo una vez.Evaluación de la condición: cuando termina el cuerpo del bucle, se ejecuta el nodo
. Escriba la lógica de la condición en este nodo.-
Decisión del bucle:
Si el nodo
devuelve la cadena True, inicia una nueva iteración desde el paso 1.Si el nodo
devuelve la cadena False, el bucle finaliza y el nodo do-while se completa correctamente.
Función clave : El cuerpo del bucle siempre se ejecuta como mínimo una vez, sin importar la condición inicial.
Componentes del nodo
Haga doble clic en un nodo do-while para abrir su lienzo interno, el cual consta de tres partes principales:
Start: marca el punto de entrada del bucle. No es posible editar ni eliminar este nodo.Cuerpo del bucle: un lienzo personalizable para sus tareas. Haga clic en Create Internal Node para agregar diversos tipos de nodos internos, como Shell, SQL y Python, que conforman el proceso de negocio repetible.
End: evalúa la condición del bucle. Este nodo es de tipo asignación y permite escribir código ODPS SQL, Shell o Python. Devuelve la cadena TrueoFalsepara determinar si el bucle continúa.
Variables integradas
En el cuerpo del bucle y en el nodo End de un nodo do-while, puede usar a continuación variables integradas para obtener el estado actual del bucle y los datos de entrada:
|
Variable integrada |
Descripción |
|
Variables integradas del sistema |
|
|
|
Número de la iteración actual, que comienza en 1. |
|
|
Desplazamiento de la iteración actual, que comienza en 0. Equivale a |
|
Uso con un nodo de asignación (suponiendo que el parámetro de entrada |
|
|
|
Recupera el conjunto de resultados completo enviado desde el nivel ascendente (normalmente una matriz bidimensional). |
|
|
Obtiene el número de filas del conjunto de resultados (la cantidad total de elementos). |
|
|
Devuelve la fila de datos que se procesa en la iteración actual. El formato de retorno es una cadena separada por comas (por ejemplo, |
|
|
(Solo para matrices bidimensionales) Recupera el valor exacto de la fila |
Ejemplo:${dag.input[0][1]}extrae el valor"beijing"de la primera fila y la segunda columna.
Notas
Requisito de edición: esta función solo está disponible en DataWorks Standard Edition y versiones superiores.
Límite del bucle: el número máximo predeterminado de iteraciones es 128, mientras que el máximo configurable es 1024. Si supera este límite, la tarea fallará.
Mecanismo de ejecución: el nodo do-while utiliza un modo de ejecución en serie y no admite procesamiento simultáneo. Cada iteración debe terminar antes de que comience la siguiente.
Limitación de depuración: no es posible ejecutar una prueba directamente en la página de Data Studio. Primero debe desplegar el flujo de trabajo y luego usar la función backfill data en Operation Center para comprobar la tarea.
Propagación de dependencias: si el nodo do-while depende de un nodo de asignación ascendente, asegúrese de iniciar el backfill desde el nodo ascendente para garantizar que la canalización de datos esté completa.
Control de flujo: si usa un Branch node dentro del cuerpo del bucle, asegúrese de que todas las rutas converjan finalmente en un Merge node para evitar interrumpir el flujo de trabajo.
Procedimiento: crear una tarea de bucle sencilla
Este ejemplo muestra cómo crear una tarea que se repite 5 veces e imprime el número de iteración actual en cada ciclo.
Paso 1: configurar el cuerpo del bucle (agregar un nodo Shell)
Cree un nodo
do-whileen su flujo de trabajo.Haga doble clic en el nodo para entrar a su lienzo interno. En el área del cuerpo del bucle, haga clic en Create Internal Node, seleccione Shell y asígnele el nombre
print_loop_times.Haga clic derecho en el nodo y seleccione Open Node.
-
Introduzca el siguiente comando en el editor de código:
# Use the built-in variable ${dag.loopTimes} to get the current loop count echo "This is loop number: ${dag.loopTimes}" Haga clic en el icono de guardar para guardar el nodo.
Paso 2: definir la condición de salida
Regrese al lienzo interno del nodo do-while, haga clic derecho en el nodo
End y seleccione Open Node.Cambie el lenguaje a Python.
-
Introduzca el siguiente código de Python:
# When the loop count is less than 5, output True and continue looping # When the loop count reaches 5, output False and exit the loop if ${dag.loopTimes} < 5: print True else: print False Guarde el nodo End.
Paso 3: desplegar, ejecutar y comprobar
Vuelva al lienzo principal del flujo de trabajo y haga clic en Deploy en la barra de herramientas para desplegar todo el flujo.
Vaya a Operation Center y localice el nodo
do-while.Haga clic derecho en el nodo y elija Backfill Data > Current Node para iniciar una ejecución de prueba.
Una vez que la instancia se ejecute correctamente, vuelva a hacer clic derecho en el nodo y seleccione View Internal Nodes.
-
Consulte las cinco iteraciones del bucle. Expanda cualquier iteración (por ejemplo, la quinta), haga clic derecho en la instancia
print_loop_timesque contiene y seleccione View Runtime Log. Debería ver la siguiente salida:This is loop number: 5
Uso avanzado: procesar una lista de datos con un nodo de asignación
Este es un escenario común y práctico: usar un nodo do-while para recorrer y procesar un conjunto de datos generado por un nodo de asignación ascendente. En este ejemplo, un nodo de asignación ODPS SQL ascendente consulta dos filas de información de usuarios y el nodo do-while procesa cada una de ellas.
Paso 1: configurar el nodo de asignación ascendente
Cree un nodo de asignación (por ejemplo, llamado
assign_sql_data) y establézcalo como ascendente del nododo-while.-
Use ODPS SQL para consultar datos en el nodo:
SELECT 'user_A', 'beijing' UNION ALL SELECT 'user_B', 'shanghai'; Guarde el nodo. Su parámetro
outputsgenerará una matriz bidimensional con dos filas de datos.
Paso 2: configurar el nodo do-while para consumir los datos
En el panel Schedule Settings, ubicado a la derecha del nodo
do-while, busque Input Parameters of This Node.-
Haga clic en Add y configure el siguiente parámetro:
Parameter Name:
input(personalizable)Value Source: seleccione
assign_sql_data.outputs
-
En el cuerpo del bucle del nodo
do-while, cree un nodo Shell e introduzca el siguiente script para procesar la fila actual:# Get the data row being processed in the current loop iteration echo "Processing data row: ${dag.input[${dag.offset}]}" -
Abra el nodo
End y use Python para definir la condición de salida:# If the number of times executed is less than the total number of data rows, continue looping if ${dag.loopTimes} < ${dag.input.length}: print True else: print False Despliegue el flujo de trabajo y, en Operation Center, inicie el backfill desde el nodo
assign_sql_data**** para asegurar que los datos fluyan correctamente hacia el bucle.
Tras una ejecución correcta, podrá observar en los registros que las dos iteraciones procesaron "user_A,beijing" y "user_B,shanghai", respectivamente.
Apéndice: comparación entre los nodos do-while y for-each
|
Función |
Nodo do-while |
Nodo for-each |
|
Lógica principal |
Basada en condiciones: repite la ejecución hasta que deje de cumplirse una condición. |
Basada en datos: se ejecuta una vez por cada elemento de la lista de entrada. |
|
Número de iteraciones |
Indeterminado; depende del momento en que se cumpla la condición. |
Determinado; equivale a la cantidad de elementos de la lista de entrada. |
|
Garantía de ejecución |
Se ejecuta como mínimo una vez (incluso si la condición inicial ya no se cumple). |
Si la entrada está vacía, no se ejecuta nada. |
|
Escenarios de uso |
Sondeo, esperas, comprobaciones de estado y procesamiento por lotes hasta vaciar el origen. |
Procesamiento por lotes de una lista conocida (por ejemplo, sincronizar un conjunto de tablas o procesar varias particiones). |
|
Método de control |
Lo controla el nodo End, que devuelve |
Termina automáticamente después de recorrer todos los elementos. |