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;
É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
Vous avez lié un moteur de calcul MaxCompute à l'espace de travail DataWorks.
Assurez-vous que les tables requises sont créées dans MaxCompute et renseignées avec des exemples de données. Pour plus de détails, consultez la section Instructions de création de table et exemples de données.
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
DESCetSHOW, 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
SELECTautonome. Dans le cas contraire, une erreur est renvoyée. Nous vous recommandons de ne pas exécuter d'instructionsSELECTd'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 instructionsINSERT.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;RemarqueLe 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
-
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.
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
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);