Fedsql

Fortgeschrittenes Tutorial: Natives JSON in SAS Viya mit FedSQL manipulieren

Simon 12 vistas

In der SAS© Viya-Umgebung ist die FedSQL-Sprache der Standard für die Interaktion mit Daten. Während sie sich hervorragend dazu eignet, Standardabfragen (ANSI SQL) in Datenbanken zu übersetzen (implizites Pass-Through), stößt sie an ihre Grenzen, sobald man proprietäre Funktionen der Datenbank-Engine nutzen möchte, wie z.B. Geospatial-Funktionen oder das Parsen von JSON.

Dieser Artikel befasst sich mit einer leistungsstarken Technik: dem expliziten Pass-Through, hier illustriert durch die Extraktion von JSON-Daten, die in PostgreSQL gespeichert sind.

Die Herausforderung: Die Grenzen der automatischen Übersetzung

Wenn Sie eine klassische FedSQL-Abfrage schreiben, versucht SAS©, diese in natives SQL zu übersetzen, um sie an die Datenbank zu senden. Enthält Ihre Abfrage jedoch Operatoren, die SAS© nicht kennt, schlägt die Übersetzung fehl, oder SAS© versucht, alle Daten lokal zu verarbeiten.

Betrachten wir den Fall von PostgreSQL, das hervorragende JSON-Verarbeitungsfunktionen über spezifische Operatoren wie -> oder ->> besitzt. Wenn Sie diese Symbole direkt in einer Standard-FedSQL-Abfrage verwenden, erhalten Sie einen Syntaxfehler, da der SAS©-Interpreter sie nicht erkennt.

Die Lösung: Das explizite Pass-Through

Die Lösung besteht darin, die Klausel CONNECTION TO zu verwenden. Diese Syntax erzeugt einen direkten "Tunnel" zur Datenbank.

Das Prinzip ist einfach: Alles, was innerhalb der Verbindungsklausel geschrieben wird, ist für den SAS©/FedSQL-Interpreter unsichtbar. SAS© nimmt die Zeichenfolge einfach und leitet sie unverändert an die PostgreSQL-Engine weiter.

Allgemeine Syntax

1PROC FEDSQL sessref=ma_session;
2 create TABLE cas.ma_table_cible as
3 select * from CONNECTION TO nom_de_la_caslib
4 (
5 /* Code SQL Natif (Postgres, Oracle, etc.) */
6 /* Invisible pour SAS */
7 );
8QUIT;

Konkreter Fall: Analyse von JSON-Daten

Stellen wir uns eine PostgreSQL-Tabelle vor, die eine Spalte data_json mit Rohdaten enthält. Wir möchten ein spezifisches Feld aus diesem JSON extrahieren und eine Aggregation berechnen, ohne das rohe JSON jemals in CAS zu laden (was aufwendig und unnötig wäre).

Der Code

1PROC FEDSQL sessref=mysession;
2 create TABLE cas.synthese_ventes as
3 select region, total_ventes
4 from connection to ma_lib_postgres
5 (
6 /* Début du code natif PostgreSQL */
7 SELECT
8 /* Extraction de la clé 'region' dans l'objet JSON */
9 data_json ->> 'region' as region,
10 /* Extraction et conversion de la clé 'montant' */
11 SUM(CAST(data_json ->> 'montant' as INTEGER)) as total_ventes
12 FROM
13 ventes_brutes_json
14 GROUP BY
15 data_json ->> 'region'
16 /* Fin du code natif PostgreSQL */
17 );
18QUIT;

Technische Analyse

Deshalb ist dieser Ansatz optimal:

  1. Unsichtbarkeit für den Interpreter (Black Box):
    Der FedSQL-Interpreter "sieht" die Operatoren -> und ->> nicht. Er versucht daher nicht, sie zu validieren. Würde er sie sehen, würde er einen Syntaxfehler zurückgeben, da diese Symbole im von SAS© unterstützten ANSI SQL-Standard nicht existieren. Es ist PostgreSQL, das die Rohzeichenkette empfängt und interpretiert.

  2. Verwendung nativer Operatoren:

    • ->: Ruft ein JSON-Objektfeld als JSON-Objekt ab.

    • ->>: Ruft ein JSON-Objektfeld als Text (String) ab.
      Diese Operatoren ermöglichen die Navigation in der hierarchischen Datenstruktur direkt auf Ebene der Speicher-Engine.

  3. Performance und "Data Movement":
    Dies ist der entscheidende Punkt.

    • Ohne explizites Pass-Through: Man müsste die gesamte Tabelle (mit dem komplexen JSON) in CAS laden und dann versuchen, den Text mit komplexen SAS©-Funktionen zu parsen. Dies verbraucht enorm viel Speicher und Netzwerkressourcen.

    • Mit explizitem Pass-Through: PostgreSQL führt die JSON-Extraktion und die Aggregation ("schwere Arbeit") durch. Der CAS-Server empfängt nur das Endergebnis: eine kleine Zusammenfassungstabelle ("kleine, gebrauchsfertige Tabelle").

Das explizite Pass-Through über CONNECTION TO ist für fortgeschrittene SAS© Viya-Benutzer unerlässlich. Es ermöglicht, die Grenzen der Standard-FedSQL-Sprache zu überwinden, um 100% der Fähigkeiten Ihrer Datenbanken (JSON-, XML-Parsing, spezifische Indizierung) zu nutzen und gleichzeitig die Datenbewegungen zum CAS-Server drastisch zu minimieren.