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.
Los códigos y ejemplos proporcionados en WeAreCAS.eu son con fines educativos. Es imperativo no copiarlos y pegarlos ciegamente en sus entornos de producción. El mejor enfoque es comprender la lógica antes de aplicarla. Recomendamos encarecidamente probar estos scripts en un entorno de prueba (Sandbox/Dev). WeAreCAS no acepta ninguna responsabilidad por cualquier impacto o pérdida de datos en sus sistemas.
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.