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é.
The codes and examples provided on WeAreCAS.eu are for educational purposes. It is imperative not to blindly copy-paste them into your production environments. The best approach is to understand the logic before applying it. We strongly recommend testing these scripts in a test environment (Sandbox/Dev). WeAreCAS accepts no responsibility for any impact or data loss on your systems.
SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. ® indicates USA registration. WeAreCAS is an independent community site and is not affiliated with SAS Institute Inc.
This site uses technical and analytical cookies to improve your experience.
Read more.