Tous les produits
Search
Centre de documentation

DataWorks:Nœud de script MaxCompute

Dernière mise à jour :Aug 10, 2026

Le nœud de script MaxCompute prend en charge le développement en mode script basé sur le moteur SQL MaxCompute 2.0. Il compile et exécute plusieurs instructions SQL en tant qu'unité unique.

Contexte

Le moteur SQL MaxCompute prend en charge le mode script, qui regroupe plusieurs instructions SQL dans un seul script compilé et exécuté comme une unité unique. Cette approche s'avère utile pour les requêtes complexes, telles que les sous-requêtes imbriquées ou les opérations en plusieurs étapes. La soumission du script entier en une seule fois génère un plan d'exécution unifié. Le job est mis en file d'attente et exécuté une seule fois, ce qui optimise l'utilisation des ressources. Pour plus d'informations, consultez la rubrique Mode script SQL. Dans DataWorks, utilisez le nœud de script MaxCompute pour créer et planifier des tâches basées sur des scripts.

Cas d'utilisation

Le mode script convient parfaitement à la réécriture de sous-requêtes profondément imbriquées ou à la division d'une logique complexe en plusieurs instructions.

Par exemple, en mode script, vous pouvez attribuer une constante à une variable et utiliser l'instruction SELECT * FROM variable pour la convertir en scalaire afin d'effectuer des calculs avec d'autres colonnes. La constante peut également être stockée dans une table contenant une seule ligne. Consultez l'exemple suivant. Pour la syntaxe de conversion, reportez-vous à la rubrique Sous-requête (SUBQUERY).

@a := SELECT 10; -- Assign the constant 10 to @a. Alternatively, assign a value from a single-row table t1, such as SELECT col1 FROM t1.
@b := SELECT key,VALUE+(SELECT * FROM @a) FROM t2 WHERE key >10000; -- Calculate a new value by using the value column from table t2 and the value from @a.
SELECT * FROM @b;
Remarque

Évitez d'utiliser un seul script avec des variables de table pour combiner des sources de données qui deviennent disponibles à des moments très différents (par exemple, une source est prête à 01:00 et une autre à 07:00). Le job ne démarre pas tant que toutes les données ne sont pas disponibles, ce qui peut entraîner des retards importants.

Prérequis

Syntaxe

Un script MaxCompute complet suit cet ordre : SET statement > DDL statement > DML statement. Chaque type peut contenir zéro ou plusieurs instructions, mais elles ne peuvent pas être entrelacées. Les instructions préfixées par un signe at (@) déclarent des variables pour transmettre les résultats entre les instructions. La syntaxe est la suivante :

--SET statements
SET odps.sql.type.system.odps2=true;
[SET odps.stage.reducer.num=***;]
[...]
--DDL statements
CREATE TABLE table1 xxx;
[CREATE TABLE table2 xxx;]
[...]
--DML statements
@var1 := SELECT [ALL | DISTINCT] select_expr, select_expr, ...
    FROM table3
    [WHERE where_condition];
@var2 := SELECT [ALL | DISTINCT] select_expr, select_expr, ...
    FROM table4
    [WHERE where_condition];
@var3 := SELECT [ALL | DISTINCT] var1.select_expr, var2.select_expr, ...
    FROM @var1 JOIN @var2 ON ...;
INSERT OVERWRITE|INTO TABLE [PARTITION (partcol1=val1, partcol2=val2 ...)]
    SELECT [ALL | DISTINCT] select_expr, select_expr, ...
    FROM @var3;
[@var4 := SELECT [ALL | DISTINCT] var1.select_expr, var.select_expr, ... FROM @var1
    UNION ALL | UNION
    SELECT [ALL | DISTINCT] var1.select_expr, var.select_expr, ... FROM @var2;
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
    AS
    SELECT [ALL | DISTINCT] select_expr, select_expr, ...
    FROM var4;]

Limites

Les limites suivantes s'appliquent au nœud de script MaxCompute :

  • Le mode script prend en charge les instructions SET, les instructions DML et certaines instructions DDL. Les instructions DDL qui affichent des résultats à l'écran, telles que DESC et SHOW, ne sont pas prises en charge.

  • Un script peut contenir au maximum une instruction qui affiche des résultats à l'écran, telle qu'une instruction SELECT autonome. Dans le cas contraire, une erreur est renvoyée. Nous vous recommandons de ne pas exécuter d'instructions SELECT d'affichage à l'écran dans les scripts.

  • Un script peut contenir au maximum une instruction CREATE TABLE AS, et celle-ci doit être la dernière instruction. Nous vous recommandons de rédiger séparément les instructions de création de table et les instructions INSERT.

  • En mode script, si une instruction échoue, toutes les instructions du script échouent.

  • En mode script, un job de traitement des données est généré uniquement lorsque toutes les données d'entrée sont prêtes.

  • En mode script, une erreur est renvoyée si une table est lue après avoir été écrite.

    Exemple incorrect :

    INSERT OVERWRITE TABLE src2 SELECT * FROM src WHERE key > 0;
    @a := SELECT * FROM src2;
    SELECT * FROM @a;

    Exemple correct :

    Pour éviter les problèmes de lecture après écriture, modifiez le script comme suit.

    @a := SELECT * FROM src WHERE key > 0;
    INSERT OVERWRITE TABLE src2 SELECT * FROM @a;
    SELECT * FROM @a;

Créer un nœud de script MaxCompute

Pour savoir comment créer un nœud, consultez la rubrique Créer un nœud de script MaxCompute.

Développer un nœud de script MaxCompute

Sur la page d'édition du nœud de script MaxCompute, sélectionnez un exemple de script adapté à vos besoins métier.

Développement de script de base

En mode script MaxCompute, la compilation SQL est simple. L'exemple suivant illustre l'utilisation de base du nœud de script MaxCompute.

CREATE TABLE IF NOT EXISTS dest(key string , VALUE bigint) ;
CREATE TABLE IF NOT EXISTS dest2(key string,VALUE bigint ) ;
@a := SELECT * FROM src WHERE VALUE >0;
@b := SELECT * FROM src2 WHERE key IS NOT NULL;
@c := SELECT * FROM src3 WHERE VALUE IS NOT NULL;
@d := SELECT a.key,b.value FROM @a LEFT OUTER JOIN @b ON a.key=b.key AND b.value>0;
@e := SELECT a.key,c.value FROM @a INNER JOIN @c ON a.key=c.key;
@f := SELECT * FROM @d UNION SELECT * FROM @e UNION SELECT * FROM @a;
INSERT OVERWRITE TABLE dest  SELECT * FROM @f;
@g := SELECT e.key,c.value  FROM @e JOIN @c ON e.key=c.key;
INSERT OVERWRITE TABLE dest2 SELECT * FROM @g;

Développement de script avancé

Le mode script MaxCompute prend en charge les instructions IF pour la logique d'exécution conditionnelle. La syntaxe IF prend en charge deux types de conditions : les expressions BOOLEAN et les sous-requêtes scalaires BOOLEAN.

  • La condition IF est une expression BOOLEAN

    Ce type d'instruction IF ELSE détermine quelle branche exécuter au moment de la compilation. Exemple :

    --Data processing
    SET odps.sql.allow.fullscan=true;
    SET odps.optimizer.cbo.rule.filter.black=LM; 
    @date := '${var}';
    @row  TABLE(key int,VALUE bigint); --Declare the variable row. Its type is Table and its schema is string. 
    IF ( cast(@date  AS bigint) % 2 == 0 ) BEGIN 
    @row  := SELECT key,VALUE FROM src1; 
    END ELSE BEGIN
    @row  := SELECT key,VALUE FROM src2; 
    END
    INSERT OVERWRITE TABLE dest1 PARTITION(p='${var}')  SELECT key,VALUE FROM @row; 
    Remarque

    Le code définit une variable nommée var. Vous devez attribuer une valeur à la variable var dans les paramètres de planification.

  • La condition IF est une sous-requête scalaire BOOLEAN

    Ce type d'instruction IF ELSE ne permet pas de déterminer quelle branche exécuter au moment de la compilation. La détermination se fait plutôt au moment de l'exécution. Par conséquent, plusieurs jobs doivent être soumis. Exemple :

    @i bigint;
    @t TABLE(id bigint, VALUE bigint);
    IF ((SELECT count(*) FROM src WHERE a = '5') > 1) BEGIN
    @i := 1;
    @t := SELECT @i, @i*2;
    END ELSE
    BEGIN
    @i := 2;
    @t := SELECT @i, @i*2;
    END
    SELECT id, VALUE FROM @t; 
  • Développement UDF intégré

    Vous pouvez également intégrer du code Java ou Python dans des scripts SQL pour développer des UDF intégrés en mode script MaxCompute. Pour plus d'informations, consultez la rubrique UDF intégré.

Déboguer un nœud de script MaxCompute

  1. Configurez les paramètres pertinents dans Run Configuration sur le côté droit de la page d'édition du nœud.

    Paramètre

    Description

    Compute resource

    Sélectionnez la ressource de calcul MaxCompute que vous avez associée.

    Compute quota

    Sélectionnez un quota de calcul pour fournir les ressources de calcul (CPU et mémoire) nécessaires à vos jobs de calcul.

    Si aucun quota de calcul n'est disponible, cliquez sur Create Compute Quota dans la liste déroulante, puis créez un quota de calcul dans la console MaxCompute.

    Resource group

    Sélectionnez un groupe de ressources de planification qui a réussi le test de connectivité avec la ressource de calcul. Pour plus d'informations, consultez la rubrique Connectivité réseau.

  2. Sélectionnez la source de données MaxCompute que vous avez créée dans la boîte de dialogue des paramètres de la barre d'outils, puis cliquez sur Run pour exécuter la tâche de script MaxCompute.

Étapes suivantes

  • Configurer les paramètres de planification : Si vous souhaitez que le nœud du répertoire du projet soit planifié périodiquement, configurez la Scheduling Policy et les propriétés de planification associées dans les Scheduling Settings sur le côté droit du nœud.

  • Déployer un nœud : Si vous souhaitez déployer la tâche dans l'environnement de production, cliquez sur l'icône image pour lancer le processus de déploiement. Les nœuds du répertoire du projet ne sont planifiés périodiquement qu'après leur déploiement dans l'environnement de production.

Instructions de création de table et exemples de données

Exemple :

--Create tables
CREATE TABLE IF NOT EXISTS src(key string ,VALUE BIGINT);
INSERT INTO src VALUES ('1',11) ;
INSERT INTO src VALUES ('1',11) ;
CREATE TABLE IF NOT EXISTS  src2(key string ,VALUE BIGINT);
INSERT INTO src2  VALUES ('1',22);
INSERT INTO src2  VALUES ('2',22);
CREATE TABLE IF NOT EXISTS  src3(key string ,VALUE BIGINT);
INSERT INTO src3 VALUES ('1',33);
INSERT INTO src3 VALUES ('3',33);