Fedsql

Optimisation SAS Viya : Émuler PROC SQL avec PROC FedSQL activé pour CAS

Simon 2 vistas

L'adoption de SAS© Viya s'accompagne souvent d'un objectif de performance : tirer parti du moteur in-memory CAS (Cloud Analytic Services) pour accélérer le traitement des données. Pour les utilisateurs habitués à PROC SQL, cela implique souvent de migrer vers PROC FedSQL.

Cependant, bien que PROC SQL soit conforme à la norme ANSI 92, il permet également de nombreuses fonctionnalités uniques propres à SAS©. PROC FedSQL, quant à lui, est conforme à la norme ANSI 99 et optimisé pour le traitement distribué, mais il ne gère pas certaines syntaxe implicites de SAS© de la même manière.

Cet article explore comment refactoriser une logique conditionnelle PROC SQL classique pour qu'elle fonctionne efficacement dans un environnement CAS avec PROC FedSQL.

Optimisation SAS Viya : Émuler PROC SQL avec PROC FedSQL activé pour CAS -

Le Défi : La gestion des booléens

En SAS© classique, une astuce courante dans PROC SQL consiste à sommer le résultat d'une expression booléenne. SAS© évalue une condition vraie comme étant égale à 1 et une fausse comme égale à 0.

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

Code PROC SQL original :

1PROC SQL;
2 create TABLE BenchMark as
3 select count(*) as ItemCount
4 , sum( abs( nhits - nruns ) < 0.1*natbat ) as DIFF_10
5 from sashelp.baseball;
6RUN;
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.

Code PROC FedSQL refactorisé pour CAS :

1PROC 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 THEN 1
6 END
7 ) as DIFF_10
8 from baseball;
9QUIT;

Analyse des changements

  1. Instruction CASE : Nous avons encapsulé la condition dans une structure CASE ... WHEN ... THEN ... END.

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

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

L'objectif lors de la migration vers SAS© Viya est d'utiliser CAS pour accélérer les routines existantes. Refactoriser le code PROC SQL en PROC FedSQL est une excellente méthode pour y parvenir, à condition de maîtriser les nuances syntaxiques entre les normes ANSI.

Pour le code PROC SQL qui s'avère trop complexe à refactoriser ou qui utilise des fonctionnalités SAS© trop spécifiques non supportées par FedSQL, il reste toujours possible de l'exécuter tel quel dans l'environnement d'exécution de programmation SAS© (SPRE) de Viya.