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ètreoutputsdu nœud en amont. Cela rend les données disponibles pour votre code.
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 |
Le nœud transmet la sortie aux nœuds en aval sous forme de tableau bidimensionnel. |
|
Python 2 |
Sortie de la dernière instruction |
DataWorks divise la chaîne de sortie par des virgules ( Par exemple, si la dernière ligne du nœud d'assignation produit Important
Si la sortie contient elle-même des virgules, vous devez les échapper. Par exemple, si la sortie est |
|
Shell |
Sortie de la dernière instruction |
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.
-
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' -
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 :
Dans le volet Scheduling Settings situé à droite, sélectionnez l'onglet Node Context Parameters.
Dans la section Input Parameters, cliquez sur Add parameters.
-
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
outputsdu 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).RemarqueAprès la configuration, le nœud en aval établit automatiquement une dépendance vis-à-vis du nœud d'assignation en amont.
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}.
-
Vérifiez le résultat
Revenez au flux de travail et cliquez sur Deploy dans la barre d'outils. Sélectionnez un déploiement complet.
Accédez à la page dans Operation Center et effectuez des tests de fumée.
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é
regionet référencez le paramètreoutputsdu 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é
typeset référencez le paramètreoutputsdu 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
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.
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).
Associez une ressource de calcul à l'espace de travail.
Accédez à Data Studio pour le développement de données et créez un nœud MaxCompute SQL.
-
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'; -
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' );ImportantSi 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
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].-
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; -
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 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.
RemarqueCe 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;
-
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 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 instructionSELECT. 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 (
printouecho). -
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.

-
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.