Tous les produits
Search
Centre de documentation

MaxCompute:Develop a MaxCompute script task

Dernière mise à jour :Aug 09, 2026

Les nœuds ODPS Script vous permettent de développer des tâches MaxCompute en mode script à l'aide du moteur SQL MaxCompute V2.0. En mode script, un fichier de script SQL entier — comprenant plusieurs instructions — est compilé comme une unité unique et soumis à MaxCompute sous la forme d'un seul plan d'exécution. Toutes les instructions s'exécutent dans une même file d'attente, ce qui permet à MaxCompute d'optimiser les traitements entre les instructions et d'utiliser pleinement les ressources disponibles.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

Quand utiliser le mode script

Utilisez le mode script lorsque vous devez :

  • Réécrire une instruction unique contenant des sous-requêtes imbriquées en plusieurs instructions plus simples qui partagent des résultats intermédiaires.

  • Diviser un script complexe en plusieurs instructions connectées par des variables.

Le mode script n'est pas adapté lorsque les données provenant de plusieurs sources présentent des écarts temporels importants entre leur disponibilité. Par exemple, si la source A est prête à 01:00 et la source B à 07:00, les variables de table ne peuvent pas regrouper efficacement ces instructions au sein d'un même script.

Pour obtenir plus d'informations générales, consultez la rubrique SQL en mode script.

Syntaxe du script

Un script MaxCompute peut contenir des instructions SET, DDL et DML. Chaque type peut apparaître zéro ou plusieurs fois, mais vous ne pouvez pas mélanger les types d'instructions.

La structure générale 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;]

Syntaxe des variables

Assignez les résultats d'une requête à une variable à l'aide de l'opérateur := :

@<variable_name> := <SELECT statement>;
Élément Description
@<variable_name> Nom de la variable précédé de @. Référencez la variable dans les instructions suivantes en utilisant @variable_name.
:= Opérateur d'affectation. Assigne le résultat de l'instruction SELECT à la variable sous la forme d'un ensemble de résultats de table.
<SELECT statement> Toute instruction SELECT valide.

Pour assigner une constante à une variable et l'utiliser comme valeur scalaire, combinez SELECT <constant> avec une instruction SELECT * FROM @variable ultérieure. Par exemple :

@a := SELECT 10; -- Assign the constant 10 to @a. You can also use SELECT col1 FROM t1 to assign a value from a single-row table.
@b := SELECT key, value + (SELECT * FROM @a) FROM t2 WHERE key > 10000;
SELECT * FROM @b;

Pour plus d'informations sur cette syntaxe, consultez la rubrique Sous-requêtes.

Limitations

Les limitations suivantes s'appliquent lors de l'écriture du code pour un nœud ODPS Script.

Types d'instructions pris en charge

Les nœuds ODPS Script prennent en charge les instructions SET, DML et un sous-ensemble d'instructions DDL. Les instructions DDL qui affichent des résultats, telles que DESC et SHOW, ne sont pas prises en charge.

Instructions affichant des résultats

N'écrivez qu'une seule instruction affichant des résultats (comme une instruction SELECT) par script. L'écriture de plusieurs instructions de ce type génère une erreur.

Erreur :

SELECT * FROM src1;
SELECT * FROM src2; -- Second result-displaying statement causes an error.

Solution : Conservez une seule instruction SELECT affichant des résultats, ou évitez totalement d'utiliser ce type d'instruction dans les scripts de production.

CREATE TABLE AS

N'écrivez qu'une seule instruction CREATE TABLE AS par script, et placez-la en dernière position. Pour maintenir la lisibilité des scripts, écrivez les instructions CREATE TABLE et INSERT dans des sections distinctes.

Comportement en cas d'échec du script

Si une instruction du script échoue, l'intégralité du script échoue.

Génération de job

MaxCompute génère un job pour le script uniquement lorsque toutes les données d'entrée sont prêtes.

Écriture puis lecture dans le même script

L'écriture de données dans une table suivie d'une lecture depuis cette même table au sein du même script provoque une erreur.

Erreur :

insert overwrite table src2 select * from src where key > 0;
@a := select * from src2; -- Reading from the table written above causes an error.
select * from @a;

Solution : Utilisez une variable pour stocker le résultat intermédiaire au lieu d'écrire et de lire la même table :

@a := select * from src where key > 0;
insert overwrite table src2 select * from @a;
select * from @a;

Exemple de base

Le script suivant joint plusieurs tables source et écrit les résultats dans deux tables de destination. Les résultats intermédiaires sont stockés dans des variables ; vous n'avez pas besoin de gérer manuellement l'ordre d'exécution des instructions.

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;
Cet exemple utilise les tables source src, src2 et src3. Pour les créer avec des exemples de données :
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);

Après l'exécution du script, la table dest contient l'union de toutes les lignes filtrées et jointes, tandis que la table dest2 contient les lignes issues de la jointure interne entre @e et @c.

Exemples avancés

Instruction IF avec une expression BOOLEAN

Lorsque la condition IF est une expression de type BOOLEAN, la branche est déterminée au moment de la compilation du code. MaxCompute évalue la condition durant la compilation et sélectionne la branche avant la soumission du job.

set odps.sql.allow.fullscan=true;
set odps.optimizer.cbo.rule.filter.black=LM;
@date := '${var}';
@row TABLE(key int, value bigint); -- Declare a table variable with schema (key int, value bigint).
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;
La variable var utilisée dans le script doit recevoir une valeur dans la section Scheduling Parameter de l'onglet Properties.

Lorsque var vaut 2 (un nombre pair), MaxCompute sélectionne la branche src1 au moment de la compilation et insère les lignes de src1 dans dest1. Lorsque var vaut 3 (un nombre impair), il insère plutôt les lignes de src2.

Instruction IF avec une sous-requête scalaire de type BOOLEAN

Lorsque la condition IF est une sous-requête scalaire de type BOOLEAN, la branche est déterminée à l'exécution du job plutôt qu'au moment de la compilation. MaxCompute doit soumettre plusieurs jobs pour évaluer la condition.

@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;

Si la table src contient plus d'une ligne où a = '5', le script définit @i sur 1 et @t sur (1, 2). Sinon, il définit @i sur 2 et @t sur (2, 4).

UDF intégrées au code

Le mode script permet d'intégrer directement du code Java ou Python dans un script SQL pour implémenter des fonctions définies par l'utilisateur (UDF). Pour plus d'informations, consultez la rubrique UDF intégrées au code.

Étapes suivantes

Une fois le développement du nœud terminé, suivez les étapes ci-dessous pour mettre la tâche en production.

Étape Description
Configurer la planification Définissez le comportement de réexécution, les cycles de planification et les dépendances de tâches afin que DataWorks exécute la tâche selon un calendrier. Consultez la rubrique Vue d'ensemble.
Déboguer le nœud Exécutez le code dans DataWorks pour vérifier votre logique avant le déploiement. Si la sortie ne correspond pas à vos attentes, corrigez le code et relancez l'exécution. Consultez la rubrique Procédure de débogage.
Déployer le nœud Déployez le nœud pour activer la planification périodique basée sur les propriétés configurées. Après le déploiement, DataWorks planifie automatiquement la tâche. Consultez la rubrique Déployer des nœuds.