Tous les produits
Search
Centre de documentation

DataWorks:Nœud d'assignation

Dernière mise à jour :Aug 10, 2026

Un nœud d'assignation transmet les résultats de requêtes ou les sorties d'un nœud en amont aux nœuds en aval. Il prend en charge MaxCompute SQL, Python 2 et Shell, et assigne automatiquement le dernier résultat de requête ou de sortie au paramètre de sortie du nœud (outputs). Les nœuds en aval référencent ce paramètre pour récupérer le résultat.

Remarques relatives à l'utilisation

  • Prérequis de version : Disponible uniquement dans DataWorks Standard Edition et versions ultérieures.

  • Autorisations : Votre compte RAM doit être ajouté à l'espace de travail cible et se voir attribuer le rôle developer ou workspace administrator. Pour plus d'informations, consultez la rubrique Ajouter des membres à un espace de travail.

Concepts clés : Transmission et référence des paramètres

La fonction principale d'un nœud d'assignation est la transmission de paramètres, qui permet de transférer des données d'un nœud en amont vers des nœuds en aval.

  • Nœud d'assignation en amont : Génère des données et assigne automatiquement la dernière sortie ou le dernier résultat de requête à un paramètre de sortie généré par le système, nommé outputs.

  • Nœud métier en aval : Reçoit et utilise les données. Configurez un paramètre d'entrée (par exemple, param) et définissez sa valeur pour référencer le paramètre outputs du nœud en amont. Cela rend les données disponibles pour votre code.

    image

Format des paramètres

Le tableau suivant décrit le format des paramètres transmis.

Langage

Valeur

Format

MaxCompute SQL

Sortie de la dernière instruction SELECT.

Le nœud transmet la sortie aux nœuds en aval sous forme de tableau bidimensionnel.

Python 2

Sortie de la dernière instruction print.

DataWorks divise la chaîne de sortie par des virgules (,) pour former un tableau unidimensionnel.

Par exemple, si la dernière ligne du nœud d'assignation produit 'Electronics,Clothing,Books', la valeur transmise aux nœuds en aval est ['Electronics','Clothing','Books'].
Important

Si la sortie contient elle-même des virgules, vous devez les échapper. Par exemple, si la sortie est 'Electronics,Clothing\, Shoes & Accessories', le nœud en aval l'analyse correctement comme ['Electronics', 'Clothing, Shoes & Accessories'].

Shell

Sortie de la dernière instruction echo.

Procédure

L'exemple suivant illustre la procédure générale en transmettant le résultat d'un nœud d'assignation à un nœud Shell. En pratique, tout type de nœud peut servir de nœud en aval.

  1. Configurez le nœud d'assignation en amont

    Dans le flux de travail cible, créez et modifiez un nœud d'assignation. Sélectionnez MaxCompute SQL, Python 2 ou Shell, et écrivez le code produisant le résultat que vous souhaitez transmettre à un nœud en aval.

    print '10,20,30,40'
  2. Configurez le nœud Shell en aval

    Créez un nœud Shell. Sur la page d'édition du nœud Shell, référencez le résultat en amont :

    1. Dans le volet Scheduling Settings situé à droite, sélectionnez l'onglet Node Context Parameters.

    2. Dans la section Input Parameters, cliquez sur Add parameters.

    3. Dans la boîte de dialogue qui s'affiche, définissez le paramètre de sortie du nœud en amont sur le paramètre outputs du nœud d'assignation configuré à l'étape précédente, et spécifiez un Parameter Name personnalisé pour le paramètre d'entrée du nœud actuel (par exemple, param).

      Remarque

      Après la configuration, le nœud en aval établit automatiquement une dépendance vis-à-vis du nœud d'assignation en amont.

    4. Une fois les paramètres configurés, utilisez la valeur transmise par le nœud en amont dans le code du nœud Shell en aval avec le format ${param}.

  3. Vérifiez le résultat

    1. Revenez au flux de travail et cliquez sur Deploy dans la barre d'outils. Sélectionnez un déploiement complet.

    2. Accédez à la page Node O&M > Auto Triggered Task O&M > Auto Triggered Task dans Operation Center et effectuez des tests de fumée.

    3. Dans l'instance de test, vérifiez si le résultat final correspond à vos attentes.

Créer un nœud d'assignation à l'aide de l'OpenAPI

Vous pouvez également créer un nœud d'assignation en appelant l'opération CreateNode de l'OpenAPI DataWorks. Lors de la création d'un nœud via l'API, configurez les informations du nœud dans le paramètre Spec de FlowSpec.

Pour associer un groupe de ressources, spécifiez l'identifiant du groupe de ressources dans le champ runtimeResource.resourceGroup de FlowSpec. Exemple :

{
  "version": "1.1.0",
  "kind": "Node",
  "spec": {
    "nodes": [
      {
        "recurrence": "Normal",
        "script": {
          "runtime": {
            "command": "CONTROLLER_ASSIGNMENT"
          },
          "content": "print '10,20,30'"
        },
        "runtimeResource": {
          "resourceGroup": "S_res_group_XXX_XXXX"
        },
        "name": "assignment_node_demo"
      }
    ]
  }
}

Si vous utilisez un code personnalisé pour appeler l'API, assurez-vous que les paramètres sont transmis de la même manière que dans le SDK Alibaba Cloud officiel. Sinon, l'association du groupe de ressources risque de ne pas prendre effet.

Notes

  • Hiérarchie de transmission : Les paramètres du nœud d'assignation ne peuvent être transmis qu'aux nœuds enfants immédiats en aval. La transmission de paramètres entre niveaux non adjacents n'est pas prise en charge.

  • Limite de taille : La taille maximale d'une valeur transmise est de 2 Mo. Si la sortie dépasse cette limite, le nœud d'assignation échoue.

  • Restrictions de syntaxe :

    • Les commentaires ne sont pas pris en charge dans le code du nœud d'assignation. L'ajout de commentaires peut entraîner des résultats inattendus.

    • La syntaxe WITH n'est pas prise en charge en mode MaxCompute SQL.

Exemples : Explication détaillée par langage

Le format de sortie de outputs et la manière dont les nœuds en aval y font référence varient selon le langage. Les exemples suivants utilisent un nœud Shell comme nœud en aval.

Exemple 1 : Transmettre les résultats de requête MaxCompute SQL

Les résultats de requête SQL sont transmis aux nœuds en aval sous forme de tableau bidimensionnel.

  • Configuration du nœud en amont (nœud d'assignation - SQL)

    Supposons que le code SQL soit le suivant et que la requête renvoie deux lignes et deux colonnes :

    SELECT 'beijing', '1001'
    UNION ALL 
    SELECT 'hangzhou', '1002';
  • Configuration et sortie du nœud en aval (nœud Shell)

    Dans le nœud Shell, ajoutez un paramètre d'entrée nommé region et référencez le paramètre outputs du nœud SQL en amont.

    Écrivez le code suivant pour lire les données :

    echo "Entire result set: ${region}"
    echo "First row: ${region[0]}"
    echo "First row, second field: ${region[0][1]}"

    DataWorks analyse directement le paramètre et effectue une substitution statique. La sortie est la suivante :

    Entire result set: beijing,1001
    hangzhou,1002
    First row: beijing,1001
    First row, second field: 1001

Exemple 2 : Transmettre les résultats de sortie Python 2

La sortie de l'instruction print de Python 2 est divisée par des virgules (,) et transmise aux nœuds en aval sous forme de tableau unidimensionnel.

  • Configuration du nœud en amont (nœud d'assignation - Python 2)

    Le code Python 2 est le suivant :

    print 'Electronics, Clothing, Books';
  • Configuration et sortie du nœud en aval (nœud Shell)

    Dans le nœud Shell, ajoutez un paramètre d'entrée nommé types et référencez le paramètre outputs du nœud d'assignation en amont.

    Écrivez le code suivant pour lire les données :

    # Directly output the entire one-dimensional array
    echo "Entire result set: ${types}"
    
    # Output elements by index
    echo "Second element: ${types[1]}"

    DataWorks analyse directement le paramètre et effectue une substitution statique. La sortie est la suivante :

    Entire result set: Electronics,Clothing,Books
    Second element: Clothing
Remarque

La logique de traitement pour les nœuds Shell est similaire à celle de Python 2 et n'est pas répétée ici.

Scénario : Traiter par lot les données de table partitionnée sur plusieurs lignes métier

Cet exemple montre comment utiliser un nœud d'assignation et un nœud for-each pour traiter par lot les données de comportement utilisateur sur plusieurs lignes métier, en automatisant le traitement des données avec une seule logique applicable à plusieurs gammes de produits.

image

Contexte

Supposons que vous soyez ingénieur en développement de données au sein d'une entreprise Internet polyvalente, chargé de traiter les données de trois lignes métier principales : commerce électronique (ecom), finance (finance) et logistique (logistics), avec la possibilité d'en ajouter d'autres à l'avenir. Vous devez exécuter chaque jour la même logique d'agrégation sur les journaux de comportement utilisateur de ces trois lignes métier afin de calculer le nombre quotidien de pages vues (PV) par utilisateur et stocker les résultats dans une table d'agrégation unifiée.

  • Tables sources en amont (couche DWD) :

    • dwd_user_behavior_ecom_d : Table de comportement utilisateur du commerce électronique.

    • dwd_user_behavior_finance_d : Table de comportement utilisateur de la finance.

    • dwd_user_behavior_logistics_d : Table de comportement utilisateur de la logistique.

    • dwd_user_behavior_${business_line}_d : Tables de comportement utilisateur pour d'autres lignes métier potentielles à l'avenir.

    • Ces tables partagent le même schéma et sont partitionnées par jour (dt).

  • Table cible en aval (couche DWS) :

    • dws_user_summary_d : Table d'agrégation utilisateur.

    • Cette table est doublement partitionnée par ligne métier (biz_line) et par jour (dt) pour stocker de manière unifiée les résultats agrégés de toutes les lignes métier.

La création d'une tâche distincte pour chaque ligne métier entraîne des coûts de maintenance élevés et est source d'erreurs. Avec un nœud for-each, vous maintenez une seule logique de traitement et le système itère automatiquement sur toutes les lignes métier pour effectuer le calcul.

Préparation des données

Commencez par créer les tables d'exemple et insérer les données de test (en prenant la date commerciale 20251010 comme exemple).

  1. Associez une ressource de calcul à l'espace de travail.

  2. Accédez à Data Studio pour le développement de données et créez un nœud MaxCompute SQL.

  3. Créez les tables sources (couche DWD) : Ajoutez le code suivant au nœud MaxCompute SQL et exécutez-le.

    -- E-commerce user behavior table
    CREATE TABLE IF NOT EXISTS dwd_user_behavior_ecom_d (
        user_id     STRING COMMENT 'User ID',
        action_type STRING COMMENT 'Action type',
        event_time  BIGINT COMMENT 'Event timestamp in milliseconds (Unix)'
    ) 
    COMMENT 'E-commerce user behavior log detail table'
    PARTITIONED BY (dt STRING COMMENT 'Date partition, format yyyymmdd');
    INSERT OVERWRITE TABLE dwd_user_behavior_ecom_d PARTITION (dt='20251010') VALUES
    ('user001', 'click',        1760004060000), -- 2025-10-10 10:01:00.000
    ('user002', 'browse',       1760004150000), -- 2025-10-10 10:02:30.000
    ('user001', 'add_to_cart',  1760004300000); -- 2025-10-10 10:05:00.000
    -- Verify e-commerce user behavior table created successfully
    SELECT * FROM dwd_user_behavior_ecom_d where dt='20251010';
    -- Finance user behavior table
    CREATE TABLE IF NOT EXISTS dwd_user_behavior_finance_d (
        user_id     STRING COMMENT 'User ID',
        action_type STRING COMMENT 'Action type',
        event_time  BIGINT COMMENT 'Event timestamp in milliseconds (Unix)'
    ) 
    COMMENT 'Finance user behavior log detail table'
    PARTITIONED BY (dt STRING COMMENT 'Date partition, format yyyymmdd');
    INSERT OVERWRITE TABLE dwd_user_behavior_finance_d PARTITION (dt='20251010') VALUES
    ('user003', 'open_app',      1760020200000), -- 2025-10-10 14:30:00.000
    ('user003', 'transfer',      1760020215000), -- 2025-10-10 14:30:15.000
    ('user003', 'check_balance', 1760020245000), -- 2025-10-10 14:30:45.000
    ('user004', 'open_app',      1760020300000); -- 2025-10-10 14:31:40.000
    -- Verify finance user behavior table created successfully
    SELECT * FROM dwd_user_behavior_finance_d where dt='20251010';
    -- Logistics user behavior table
    CREATE TABLE IF NOT EXISTS dwd_user_behavior_logistics_d (
        user_id     STRING COMMENT 'User ID',
        action_type STRING COMMENT 'Action type',
        event_time  BIGINT COMMENT 'Event timestamp in milliseconds (Unix)'
    ) 
    COMMENT 'Logistics user behavior log detail table'
    PARTITIONED BY (dt STRING COMMENT 'Date partition, format yyyymmdd');
    INSERT OVERWRITE TABLE dwd_user_behavior_logistics_d PARTITION (dt='20251010') VALUES
    ('user001', 'check_status',    1760032800000), -- 2025-10-10 18:00:00.000
    ('user005', 'schedule_pickup', 1760032920000); -- 2025-10-10 18:02:00.000
    -- Verify logistics user behavior table created successfully
    SELECT * FROM dwd_user_behavior_logistics_d where dt='20251010';
  4. Créez la table cible (couche DWS) : Ajoutez le code suivant au nœud MaxCompute SQL et exécutez-le.

    CREATE TABLE IF NOT EXISTS dws_user_summary_d (
        user_id     STRING COMMENT 'User ID',
        pv          BIGINT COMMENT 'Daily activity count'
    ) 
    COMMENT 'User daily activity summary table'
    PARTITIONED BY (
        dt           STRING COMMENT 'Date partition, format yyyymmdd',
        biz_line     STRING COMMENT 'Business line partition, e.g. ecom, finance, logistics'
    );
    Important

    Si l'espace de travail utilise le mode standard, vous devez déployer ce nœud dans l'environnement de production et remplir les données rétrospectives.

Implémentation du flux de travail

  1. Créez un flux de travail. Dans la section Scheduling Parameters située à droite, définissez le paramètre de planification bizdate sur la veille : $[yyyymmdd-1].

  2. Dans le flux de travail, créez un nœud d'assignation nommé get_biz_list et écrivez le code suivant en MaxCompute SQL. Ce nœud génère la liste des lignes métier à traiter :

    -- Output all business lines to be processed
    SELECT 'ecom' AS biz_line
    UNION ALL
    SELECT 'finance' AS biz_line
    UNION ALL
    SELECT 'logistics' AS biz_line;
  3. Configurez le nœud for-each

    • Revenez à la page du flux de travail et créez un nœud for-each en aval pour le nœud d'assignation get_biz_list.

    • Ouvrez la page des paramètres du nœud for-each. Dans la section Scheduling Parameters > Script Parameters sous schedule settings à droite, liez le paramètre loopDataArray à la sortie outputs du nœud get_biz_list.

    • Dans le corps de boucle du nœud for-each, cliquez sur Create Internal Node et créez un nœud MaxCompute SQL. Écrivez la logique de traitement à l'intérieur du corps de boucle.

      Remarque
      • Ce script est piloté par le nœud for-each et s'exécute une fois pour chaque ligne métier.

      • La variable intégrée ${dag.foreach.current} est remplacée dynamiquement par le nom de la ligne métier actuelle à chaque itération. Les valeurs d'itération attendues sont : 'ecom', 'finance', 'logistics'.

      SET odps.sql.allow.dynamic.partition=true;
      INSERT OVERWRITE TABLE dws_user_summary_d PARTITION (dt='${bizdate}', biz_line)
      SELECT
          user_id,
          COUNT(*) AS pv,
          '${dag.foreach.current}' AS biz_line
      FROM
          dwd_user_behavior_${dag.foreach.current}_d
      WHERE
          dt = '${bizdate}'
      GROUP BY
          user_id;
  4. Ajoutez un nœud de vérification

    Revenez au flux de travail. Cliquez sur Create Downstream sur le nœud for-each pour créer un nœud MaxCompute SQL et ajoutez le code suivant.

    SELECT * FROM dws_user_summary_d WHERE dt='20251010' ORDER BY biz_line, user_id;

Déploiement et résultats

Déployez le flux de travail dans l'environnement de production. Accédez à la page Auto Triggered Task O&M > Auto Triggered Task dans Operation Center. Recherchez le flux de travail cible et effectuez un test de fumée en définissant la date commerciale sur '20251010'.

Une fois l'exécution terminée, consultez le journal d'exécution dans l'instance de test. La sortie attendue du nœud final est la suivante :

|
**user_id**
|
**pv**
|
**dt**
|
**biz_line**
| | --- | --- | --- | --- | |
user001
|
2
|
20251010
|
ecom
| |
user002
|
1
|
20251010
|
ecom
| |
user003
|
3
|
20251010
|
finance
| |
user004
|
1
|
20251010
|
finance
| |
user001
|
1
|
20251010
|
logistics
| |
user005
|
1
|
20251010
|
logistics
|























































Avantages

  • Haute évolutivité : Pour ajouter une nouvelle ligne métier, il suffit d'ajouter une ligne de SQL dans le nœud d'assignation sans modifier la logique de traitement.

  • Maintenance simplifiée : Toutes les lignes métier partagent la même logique de traitement. Une modification unique s'applique à toutes.

FAQ

  • Q : En mode MaxCompute SQL, l'erreur « find no select sql in sql assignment! » est renvoyée.

    R : Le code MaxCompute SQL ne contient pas d'instruction SELECT. Ajoutez une instruction SELECT. La syntaxe WITH n'est pas prise en charge ; l'utilisation d'une instruction WITH renvoie également cette erreur.

  • Q : En mode Shell ou Python, l'erreur « OutPut Result is null, cannot handle! » est renvoyée.

    R : La sortie est manquante. Vérifiez si le code contient une instruction print (print ou echo).

  • Q : En mode Shell ou Python, comment gérer les éléments de sortie contenant des virgules ?

    R : Échappez les virgules (,) en utilisant \,. L'exemple suivant utilise Python :

    categories = ["Electronics", "Clothing, Shoes & Accessories"]
    # Escape commas contained in each element
    # Replace ',' with '\,'
    escaped_categories = [cat.replace(",", "\,") for cat in categories]
    # Join escaped elements with commas
    output_string = ",".join(escaped_categories)
    print output_string
    # The final string output to downstream is:
    # Electronics,Clothing\, Shoes & Accessories
  • Q : Un nœud en aval peut-il recevoir les résultats de plusieurs nœuds d'assignation en amont ?

    R : Oui. Il suffit d'assigner les résultats de différents nœuds à des paramètres distincts.

    image

  • Q : Le nœud d'assignation prend-il en charge d'autres types de langage ?

    R : Le nœud d'assignation prend actuellement en charge uniquement MaxCompute SQL, Python 2 et Shell. Certains types de nœuds, tels que EMR Hive, Hologres SQL, EMR Spark SQL, AnalyticDB for PostgreSQL, ClickHouse SQL et MySQL, prennent nativement en charge la fonctionnalité assignment parameter, qui produit le même effet.

    Dans la section Node Output Parameters, cliquez sur + Add Assignment Parameter.

Références

  • Si le nœud en aval doit itérer et traiter les données en boucle, consultez les rubriques Nœud Do-while et Nœud For-each.

  • Si vous devez transmettre des paramètres entre différents niveaux, consultez la rubrique Nœud virtuel.

  • Pour plus d'informations sur la configuration de la transmission des paramètres, consultez la rubrique Paramètres de contexte du nœud.