Optimisation SAS Viya : Émuler PROC SQL avec PROC FedSQL activé pour CAS
Simon 33 vues
Niveau de difficulté
Confirmé
Publié le :
Le conseil de l'expert
Michael
Le passage au traitement in-memory sur CAS exige d'abandonner certains raccourcis historiques du PROC SQL : la souplesse des conversions implicites laisse place à la rigueur de la norme ANSI. Pour garantir la performance de vos requêtes FedSQL, remplacez systématiquement les sommes de conditions par des clauses CASE WHEN explicites. C'est cette précision syntaxique qui permet au moteur CAS de paralléliser vos calculs efficacement sans erreur d'interprétation.
Cet article explore comment refactoriser une logique conditionnelle PROC SQL classique pour qu'elle fonctionne efficacement dans un environnement CAS avec PROC FedSQL.
Prenons cet exemple utilisant la table sashelp.baseball. Nous voulons compter le nombre total d'éléments et calculer une somme basée sur une condition complexe (où la différence absolue entre les coups sûrs et les points est inférieure à 10% des présences au bâton).
Dans ce code, l'expression abs( nhits - nruns ) < 0.1*natbat retourne implicitement 1 ou 0, ce qui permet à la fonction SUM de fonctionner directement.
La Solution : Utiliser CASE dans PROC FedSQL
Lorsque nous passons à PROC FedSQL pour exécuter ce code de manière distribuée sur CAS, cette conversion implicite de booléen en entier n'est pas supportée de la même façon par la norme ANSI plus stricte. Si vous tentez d'exécuter le code tel quel, il échouera ou ne produira pas le résultat escompté.
Pour émuler ce comportement, nous devons rendre la logique explicite en utilisant une instruction CASE.
proc fedsql sessref=casauto;
create table BenchMark as
select count(*) as ItemCount
, sum(case
when (abs (nhits - nruns ) < (0.1*natbat)) is true then 1
end
) as DIFF_10
from baseball;
quit;
1
PROC FEDSQL sessref=casauto;
2
create TABLE BenchMark as
3
select count(*) as ItemCount
4
, sum(case
5
when (abs (nhits - nruns ) < (0.1*natbat)) is true THEN1
6
END
7
) as DIFF_10
8
from baseball;
9
QUIT;
Analyse des changements
Instruction CASE : Nous avons encapsulé la condition dans une structure CASE ... WHEN ... THEN ... END.
Explicitation : La clause WHEN ... IS TRUE THEN 1 force le moteur à renvoyer la valeur numérique 1 lorsque la condition est remplie. Si la condition est fausse, le CASE renvoie implicitement NULL (ou on pourrait ajouter un ELSE 0), ce qui est ignoré par la fonction SUM, reproduisant ainsi le comportement du PROC SQL original.
Exécution CAS : Grâce à l'option sessref=casauto (ou le nom de votre session CAS), ce code s'exécute désormais avec la puissance du calcul distribué.
Les codes et exemples fournis sur WeAreCAS.eu sont à but pédagogique. Il est impératif de ne pas les copier-coller aveuglément sur vos environnements de production. La meilleure approche consiste à comprendre la logique avant de l'appliquer. Nous vous recommandons vivement de tester ces scripts dans un environnement de test (Sandbox/Dev). WeAreCAS décline toute responsabilité quant aux éventuels impacts ou pertes de données sur vos systèmes.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.