Dieser Artikel untersucht, wie eine klassische bedingte PROC SQL-Logik refaktorisiert werden kann, damit sie in einer CAS-Umgebung mit PROC FedSQL effizient funktioniert.
Nehmen wir dieses Beispiel unter Verwendung der Tabelle sashelp.baseball. Wir möchten die Gesamtzahl der Elemente zählen und eine Summe basierend auf einer komplexen Bedingung berechnen (wobei die absolute Differenz zwischen den Hits und den Runs weniger als 10 % der At-Bats beträgt).
In diesem Code gibt der Ausdruck abs( nhits - nruns ) < 0.1*natbat implizit 1 oder 0 zurück, wodurch die SUM-Funktion direkt arbeiten kann.
Die Lösung: Verwendung von CASE in PROC FedSQL
Wenn wir zu PROC FedSQL wechseln, um diesen Code verteilt auf CAS auszuführen, wird diese implizite Konvertierung von Boolscher Logik in eine Ganzzahl vom strengeren ANSI-Standard nicht auf die gleiche Weise unterstützt. Wenn Sie versuchen, den Code unverändert auszuführen, wird er fehlschlagen oder nicht das erwartete Ergebnis liefern.
Um dieses Verhalten zu emulieren, müssen wir die Logik explizit mit einer CASE-Anweisung machen.
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 der Änderungen
CASE-Anweisung: Wir haben die Bedingung in eine CASE ... WHEN ... THEN ... END-Struktur gekapselt.
Explizitmachung: Die Klausel WHEN ... IS TRUE THEN 1 zwingt die Engine, den numerischen Wert 1 zurückzugeben, wenn die Bedingung erfüllt ist. Wenn die Bedingung falsch ist, gibt der CASE implizit NULL zurück (oder man könnte ein ELSE 0 hinzufügen), was von der SUM-Funktion ignoriert wird und so das Verhalten des ursprünglichen PROC SQL reproduziert.
CAS-Ausführung: Dank der Option sessref=casauto (oder dem Namen Ihrer CAS-Sitzung) wird dieser Code nun mit der Leistung der verteilten Berechnung ausgeführt.
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.