Fedsql

SAS Viya-Optimierung: Emulation von PROC SQL mit CAS-aktiviertem PROC FedSQL

Simon 4 vistas

Die Einführung von SAS© Viya geht oft mit einem Leistungsziel einher: die Nutzung der In-Memory-Engine CAS (Cloud Analytic Services), um die Datenverarbeitung zu beschleunigen. Für Benutzer, die an PROC SQL gewöhnt sind, bedeutet dies oft eine Migration zu PROC FedSQL.

Obwohl PROC SQL dem ANSI-92-Standard entspricht, ermöglicht es auch viele einzigartige, SAS©-spezifische Funktionen. PROC FedSQL hingegen entspricht dem ANSI-99-Standard und ist für die verteilte Verarbeitung optimiert, handhabt jedoch einige implizite SAS©-Syntaxen nicht auf die gleiche Weise.

Dieser Artikel untersucht, wie eine klassische bedingte PROC SQL-Logik refaktorisiert werden kann, damit sie in einer CAS-Umgebung mit PROC FedSQL effizient funktioniert.

SAS Viya-Optimierung: Emulation von PROC SQL mit CAS-aktiviertem PROC FedSQL -

Die Herausforderung: Umgang mit Booleschen Werten

Im klassischen SAS© besteht ein gängiger Trick in PROC SQL darin, das Ergebnis eines booleschen Ausdrucks zu summieren. SAS© wertet eine wahre Bedingung als gleich 1 und eine falsche als gleich 0 aus.

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

Ursprünglicher PROC SQL-Code:

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

Refaktorisierter PROC FedSQL-Code für 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 der Änderungen

  1. CASE-Anweisung: Wir haben die Bedingung in eine CASE ... WHEN ... THEN ... END-Struktur gekapselt.

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

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

Das Ziel bei der Migration zu SAS© Viya ist die Nutzung von CAS, um bestehende Routinen zu beschleunigen. Das Refactoring von PROC SQL-Code zu PROC FedSQL ist eine ausgezeichnete Methode, dies zu erreichen, vorausgesetzt, man beherrscht die syntaktischen Nuancen zwischen den ANSI-Standards.

Für PROC SQL-Code, der sich als zu komplex für ein Refactoring erweist oder der zu spezifische, von FedSQL nicht unterstützte SAS©-Funktionen verwendet, besteht immer noch die Möglichkeit, ihn unverändert in der SAS©-Programmierlaufzeitumgebung (SPRE) von Viya auszuführen.