Cet article a pour but de vous guider dans vos premiers pas avec CAS, en couvrant l'ensemble du processus, de l'établissement d'une session à l'analyse des données.
L'architecture CAS en bref
Le serveur CAS peut fonctionner sur une seule machine (SMP) ou en mode distribué sur plusieurs machines (MPP). L'architecture distribuée comprend :
Un nœud contrôleur (Controller) : Il communique avec les applications clientes et dirige le travail.
Des nœuds de travail (Workers) : Ils effectuent les calculs et l'analyse sur les lignes de données stockées en mémoire sur leur nœud respectif.
Les avantages clés de CAS
Voici un résumé des principaux avantages de l'utilisation de l'environnement CAS :
Tableau 1 : Bénéfices de l'environnement CAS
Bénéfice
Description
Vitesse de traitement
L'architecture distribuée et le traitement en mémoire permettent des analyses extrêmement rapides sur des données volumineuses.
Tolérance aux pannes
Si un nœud de travail ne répond plus, le contrôleur redirige le travail vers un autre nœud utilisant une copie des données, assurant la continuité.
Évolutivité (Scalabilité)
Il est possible d'ajouter horizontalement des nœuds de travail pour répartir la charge et améliorer les temps de traitement.
La différence majeure : Le traitement parallèle
Dans CAS, l'étape DATA s'exécute de manière distribuée. Les données très volumineuses sont divisées entre les "threads" (fils d'exécution) disponibles sur les différentes machines. Le code de l'étape DATA est copié et exécuté simultanément sur chaque thread, ne traitant que la portion de données locale à ce thread.
Exemple de traitement parallèle :
Dans l'exemple ci-dessous, nous ajoutons des frais de transaction à une grande table bancaire. L'utilisation de la variable automatique _THREADID_ dans le journal montre que le code s'exécute sur plusieurs threads différents (par exemple, 4 threads).
data mycas.updated_transaction_history;
set mycas.transaction_history;
/* Logique pour ajouter des frais selon l'année */
if year(transaction_dt)=2013 then fee=1;
/* ... autres années ... */
new_transaction_amt=transaction_amt+fee;
put _threadid_=; /* Affiche le numéro du thread dans le journal */
run;
1
DATA mycas.updated_transaction_history;
2
SET mycas.transaction_history;
3
/* Logique pour ajouter des frais selon l'année */
4
IF year(transaction_dt)=2013THEN fee=1;
5
/* ... autres années ... */
6
new_transaction_amt=transaction_amt+fee;
7
put _threadid_=; /* Affiche le numéro du thread dans le journal */
Étape 5 : Utiliser PROC CAS pour exécuter des actions
PROC CAS est l'interface pour exécuter le langage CASL (CAS Language). CASL interagit avec le serveur via des "actions". Les actions sont des demandes de tâches spécifiques (gestion de tables, analyses, etc.), regroupées en "ensembles d'actions" (action sets).
Voici des exemples d'actions de l'ensemble table pour gérer les données :
Vérifier l'existence d'une table et récupérer des infos :
proc cas;
session casauto;
/* Vérifier si la table existe */
table.tableexists result=r / caslib='casuser' name='updated_transaction_history';
if (r.exists) then do;
/* Obtenir les infos de la table */
table.tableinfo / caslib='casuser' name='updated_transaction_history';
/* Récupérer (fetch) un échantillon de lignes */
table.fetch / table={caslib='casuser', name='updated_transaction_history'} from=1 to=20;
end;
quit;
Promouvoir une table (la rendre globale) :
Les tables créées sont souvent de portée "session". L'action promote permet de les rendre disponibles aux autres utilisateurs.
Méthode A : Utiliser une action CAS (ex: simple.freq)
L'ensemble d'actions simple fournit des fonctions analytiques de base.
proc cas;
session casauto;
/* Distribution de fréquence du statut de transaction groupé par année */
simple.freq /
inputs={'transaction_status'}
table={caslib='casuser', name='updated_transaction_history', groupby={name='year'}};
quit;
1
PROC CAS;
2
SESSION casauto;
3
/* Distribution de fréquence du statut de transaction groupé par année */
/* Préparation des données : ajout d'une colonne mois */
data mycas.updated_transaction_history2;
set mycas.updated_transaction_history;
month=put(transaction_dt,monname8.);
run;
/* Calcul des sommes par année et mois */
proc mdsummary data=mycas.updated_transaction_history2(where=(fee ne 0));
var fee;
groupby year month / out=mycas.summary_transaction_history;
run;
/* Affichage des résultats (car MDSUMMARY ne produit qu'une table de sortie) */
proc print data=mycas.summary_transaction_history label;
title 'Résumé de l\'historique des transactions';
var year month _sum_;
label _sum_='Total collecté ($)';
format _sum_ dollar8.;
run;
1
/* Préparation des données : ajout d'une colonne mois */
2
DATA mycas.updated_transaction_history2;
3
SET mycas.updated_transaction_history;
4
month=put(transaction_dt,monname8.);
5
RUN;
6
7
/* Calcul des sommes par année et mois */
8
PROC MDSUMMARYDATA=mycas.updated_transaction_history2(where=(fee ne 0));
9
var fee;
10
groupby year month / out=mycas.summary_transaction_history;
11
RUN;
12
13
/* Affichage des résultats (car MDSUMMARY ne produit qu'une table de sortie) */
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.