Cependant, lorsque les sources de données sont volumineuses (plusieurs téraoctets), charger l'intégralité de la table pour n'en utiliser qu'un résumé ou un sous-ensemble est inefficace. Cela consomme inutilement de la bande passante réseau et de la RAM.
Bien que PROC CASUTIL offre des options simples (WHERE=, VAR=), il existe une méthode beaucoup plus puissante pour effectuer des agrégations complexes ou des jointures directement dans la base de données avant même que les données n'arrivent dans CAS : le FedSQL Pass-Through.
Ce tutoriel explore deux méthodes pour déléguer le travail à la base de données : le mode Implicite et le mode Explicite.
Méthode 1 : Le Pass-Through Implicite (La méthode "Standard")
Le Pass-Through implicite permet d'écrire du code FedSQL standard (proche du SQL ANSI). Le connecteur de données CAS (Data Connector) se charge de traduire votre requête en langage natif de la base de données (SQL Postgres, T-SQL, PL/SQL, etc.).
L'Exemple : Agrégation simple
Imaginons une table Postgres de 2 millions de lignes (orders_large). Nous voulons charger dans CAS uniquement la somme des ventes par type de commande, filtrée sur une date.
cas mysession;
/* Définition de la connexion à Postgres */
caslib caspgr datasource=(srctype="postgres", database="DCON", server="...", ...) libref=caspgr;
proc fedsql sessref=mysession;
/* Création de la table résultante directement dans la RAM de CAS */
create table caspgr.revenuesummary{options replace=true} as
select order_type, sum(total_sale) as revenue
from caspgr."orders_large" /* Notez les guillemets pour préserver la casse */
where order_date < date'2015-01-01'
group by order_type;
quit;
/* Création de la table résultante directement dans la RAM de CAS */
7
create TABLE caspgr.revenuesummary{options replace=true} as
8
select order_type, sum(total_sale) as revenue
9
from caspgr."orders_large"/* Notez les guillemets pour préserver la casse */
10
where order_date < date'2015-01-01'
11
group BY order_type;
12
QUIT;
Ce qui se passe en coulisses :
Si la table orders_large n'est pas déjà chargée dans CAS, le moteur détecte qu'il s'agit d'une table externe. Il traduit la requête en SQL Postgres, l'envoie au serveur, et ne charge dans CAS que le résultat agrégé (quelques lignes).
Gain de performance :
Méthode classique (Chargement total + Agrégation CAS) : ~38 secondes.
Méthode Pass-Through (Agrégation en base + Chargement résultat) : ~0.32 secondes.
Méthode 2 : Le Pass-Through Explicite (La méthode "Power User")
Parfois, vous devez utiliser des fonctionnalités très spécifiques à votre base de données (fonctions JSON, fonctions géospatiales, index particuliers) que le FedSQL standard ne connaît pas.
SELECT ... FROM CONNECTION TO nom_caslib ( votre_requête_native_ici )
1
SELECT ... FROM CONNECTION TO nom_caslib ( votre_requête_native_ici )
L'Exemple Avancé : Parsing JSON dans Postgres
Supposons que votre table Postgres jsonorders contienne une colonne de type JSON. Vous voulez extraire des informations structurées (état du client, quantité) stockées dans ce JSON et les agréger avant le chargement dans CAS.
FedSQL ne sait pas parser du JSON nativement, mais Postgres si.
proc fedsql sessref=mysession;
create table caspgr.StateSalesSummary as
select customerstate, minquantity, maxquantity, sumquantity
from connection to caspgr
(
/* DEBUT DU SQL NATIF POSTGRES */
SELECT customerstate,
min(quantity) as minquantity,
max(quantity) as maxquantity,
sum(quantity) as sumquantity
FROM
(
/* Utilisation des opérateurs JSON Postgres -> et ->> */
SELECT orderinfo -> 'customer' ->> 'state' as customerstate,
cast(orderinfo -> 'items' ->> 'qty' as integer) as quantity
FROM jsonorders
) t
GROUP BY customerstate
/* FIN DU SQL NATIF POSTGRES */
);
quit;
Résultat : Postgres effectue l'extraction JSON et l'agrégation lourde. CAS ne reçoit qu'une petite table de synthèse prête à l'emploi.
Important Disclaimer
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.