L'action table.append est l'outil indispensable pour alimenter des tables historiques ou des entrepôts de données au sein de SAS Viya. Contrairement à une recréation complète de table, elle permet d'ajouter de nouvelles strates de données de manière chirurgicale et performante.
Avant d'exécuter un append massif, assurez-vous que les types de colonnes (VARCHAR vs CHAR, INT vs DOUBLE) sont strictement identiques entre la source et la cible. Une différence de type pourrait faire échouer l'action ou entraîner une conversion de données indésirable.
L'action CAS 'table.append' est utilisée pour transférer des lignes d'une table source (en mémoire ou promotée) vers une table cible existante dans le CAS. Le paramètre 'WHERE' dans l'option 'source' permet de spécifier une condition logique. Seules les lignes de la table source qui satisfont cette condition seront ajoutées à la table cible. L'exécution se fait en mémoire distribuée sur le serveur CAS, ce qui est optimisé pour les grands volumes de données. La table cible doit déjà exister.
Analyse des données
Type : CREATION_INTERNE
Les exemples utilisent des données générées (datalines) ou des tables SASHELP chargées en CAS.
1 Bloc de code
PROC CAS / DATA STEP Data
Explication : Cet exemple initialise deux tables CAS, 'class_source' (à partir de SASHELP.CLASS) et 'class_target' (vide). Il utilise ensuite 'table.append' pour ajouter toutes les lignes de 'class_source' à 'class_target' sans aucune condition de filtrage. Enfin, il affiche le contenu de la table cible.
Copié !
/* Charger la table SASHELP.CLASS en CAS */
proc casutil;
load data=sashelp.class outcaslib="casuser" casout="class_source" replace;
run;
/* Créer une table cible vide avec la même structure en CAS */
data casuser.class_target;
set casuser.class_source(obs=0);
run;
proc cas;
/* Ajouter toutes les lignes de class_source à class_target */
table.append /
source={caslib='casuser', name='class_source'}
target={caslib='casuser', name='class_target'};
run;
/* Vérifier le contenu de la table cible */
proc print data=casuser.class_target;
run;
/* Créer une table cible vide avec la même structure en CAS */
7
DATA casuser.class_target;
8
SET casuser.class_source(obs=0);
9
RUN;
10
11
PROC CAS;
12
/* Ajouter toutes les lignes de class_source à class_target */
13
TABLE.append /
14
SOURCE={caslib='casuser', name='class_source'}
15
target={caslib='casuser', name='class_target'};
16
RUN;
17
18
/* Vérifier le contenu de la table cible */
19
PROC PRINTDATA=casuser.class_target;
20
RUN;
2 Bloc de code
PROC CAS / DATA STEP Data
Explication : Cet exemple charge la table complète SASHELP.CLASS en CAS sous le nom 'class_full'. Il crée une table 'class_filtered' avec quelques observations initiales. Ensuite, il utilise 'table.append' avec le paramètre 'where="Age >= 15"' pour ajouter uniquement les observations de 'class_full' où l'âge est de 15 ans ou plus à la table 'class_filtered'. Le contenu final de 'class_filtered' est affiché.
Copié !
/* Charger la table SASHELP.CLASS en CAS */
proc casutil;
load data=sashelp.class outcaslib="casuser" casout="class_full" replace;
run;
/* Créer une table cible avec quelques données initiales */
data casuser.class_filtered;
input Name $ Sex $ Age Height Weight;
datalines;
Alfred M 14 69.0 112.5
Alice F 13 56.5 84.0
;
run;
proc cas;
/* Ajouter uniquement les étudiants dont l'âge est supérieur ou égal à 15 ans */
table.append /
source={caslib='casuser', name='class_full', where="Age >= 15"}
target={caslib='casuser', name='class_filtered'};
run;
/* Vérifier le contenu de la table cible */
proc print data=casuser.class_filtered;
run;
Explication : Cet exemple démontre un cas avancé où les données sont d'abord transformées dans une nouvelle table CAS ('students_processed') en calculant un score moyen et un statut. Ensuite, 'table.append' est utilisé pour ajouter à la table 'high_achievers' uniquement les observations de 'students_processed' qui satisfont une condition 'WHERE' complexe : le statut doit être 'Excellent' ET le genre doit être 'Féminin'. Cela illustre comment combiner des étapes de préparation de données avec un ajout conditionnel.
Copié !
/* Créer une table source avec des données brutes en CAS */
data casuser.students_raw;
input StudentID Name $ Gender $ Score1 Score2;
datalines;
101 Jean M 85 92
102 Marie F 78 88
103 Pierre M 91 75
104 Sophie F 65 95
105 Paul M 80 81
;
run;
/* Créer une table cible avec des données initiales */
data casuser.high_achievers;
input StudentID Name $ Gender $ AverageScore Status$;
datalines;
201 Marc M 90 Initial
;
run;
proc cas;
/* Calculer le score moyen et déterminer un statut avant d'ajouter */
data casuser.students_processed;
set casuser.students_raw;
AverageScore = (Score1 + Score2) / 2;
if AverageScore >= 85 then Status = 'Excellent';
else Status = 'Good';
run;
/* Ajouter uniquement les étudiants 'Excellent' et de sexe féminin */
table.append /
source={caslib='casuser', name='students_processed', where="Status = 'Excellent' AND Gender = 'F'"}
target={caslib='casuser', name='high_achievers'};
run;
/* Vérifier le contenu de la table cible */
proc print data=casuser.high_achievers;
run;
1
/* Créer une table source avec des données brutes en CAS */
2
DATA casuser.students_raw;
3
INPUT StudentID Name $ Gender $ Score1 Score2;
4
DATALINES;
5
101 Jean M 8592
6
102 Marie F 7888
7
103 Pierre M 9175
8
104 Sophie F 6595
9
105 Paul M 8081
10
;
11
RUN;
12
13
/* Créer une table cible avec des données initiales */
14
DATA casuser.high_achievers;
15
INPUT StudentID Name $ Gender $ AverageScore STATUS$;
16
DATALINES;
17
201 Marc M 90 Initial
18
;
19
RUN;
20
21
PROC CAS;
22
/* Calculer le score moyen et déterminer un statut avant d'ajouter */
23
DATA casuser.students_processed;
24
SET casuser.students_raw;
25
AverageScore = (Score1 + Score2) / 2;
26
IF AverageScore >= 85THENSTATUS = 'Excellent';
27
ELSESTATUS = 'Good';
28
RUN;
29
30
/* Ajouter uniquement les étudiants 'Excellent' et de sexe féminin */
31
TABLE.append /
32
SOURCE={caslib='casuser', name='students_processed', where="Status = 'Excellent' AND Gender = 'F'"}
33
target={caslib='casuser', name='high_achievers'};
34
RUN;
35
36
/* Vérifier le contenu de la table cible */
37
PROC PRINTDATA=casuser.high_achievers;
38
RUN;
4 Bloc de code
PROC CAS / DATA STEP Data
Explication : Cet exemple crée une table SAS temporaire 'temp_large' avec 1000 observations, puis la charge et la 'promotée' en tant que 'large_data_source' en CAS. Il crée également une table cible promotée vide 'filtered_promoted'. Il utilise ensuite 'table.append' pour ajouter à 'filtered_promoted' uniquement les lignes où 'Value < 10'. L'aspect Viya/CAS est souligné par l'utilisation de tables promotées qui sont persistantes au-delà de la session actuelle, et un bloc de nettoyage final pour supprimer toutes les tables CAS créées lors des exemples.
Copié !
/* Créer une table source temporaire avec un grand nombre d'observations */
data _null_;
do i = 1 to 1000;
ID = i;
Value = mod(i, 100);
output;
end;
run;
proc casutil;
load data=work.temp_large outcaslib="casuser" casout="large_data_source" promote replace;
run;
/* Créer une table cible promotée vide */
proc casutil;
load data=work.temp_large(obs=0) outcaslib="casuser" casout="filtered_promoted" promote replace;
run;
proc cas;
/* Ajouter des lignes à la table promotée 'filtered_promoted' avec une condition WHERE */
/* L'utilisation de 'promote' assure la persistance de la table au-delà de la session */
table.append /
source={caslib='casuser', name='large_data_source', where="Value < 10"}
target={caslib='casuser', name='filtered_promoted'};
run;
/* Vérifier le contenu de la table cible promotée */
proc print data=casuser.filtered_promoted;
run;
/* Nettoyage : supprimer les tables CAS après utilisation */
proc cas;
table.dropTable / caslib='casuser', name='large_data_source';
table.dropTable / caslib='casuser', name='filtered_promoted';
table.dropTable / caslib='casuser', name='students_raw';
table.dropTable / caslib='casuser', name='high_achievers';
table.dropTable / caslib='casuser', name='class_source';
table.dropTable / caslib='casuser', name='class_target';
table.dropTable / caslib='casuser', name='class_full';
table.dropTable / caslib='casuser', name='class_filtered';
table.dropTable / caslib='casuser', name='students_processed';
run;
1
/* Créer une table source temporaire avec un grand nombre d'observations */
L'utilisation du parametre WHERE directement dans l'action table.append est plus efficiente qu'un filtrage prealable dans une etape DATA, car le moteur CAS applique le filtre lors de la lecture des blocs de donnees en memoire, evitant ainsi la creation d'une table intermediaire et minimisant les mouvements de donnees entre les noeuds du cluster.
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Documentation liée
Aucune documentation spécifique pour cette catégorie.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.