Publié le :
Gestion de données CREATION_INTERNE

Indexer un fichier SASHDAT existant

Ce code est également disponible en : Deutsch English Español
En attente de validation
L'action `table.index` est utilisée pour créer un index sur des colonnes spécifiées d'un fichier SASHDAT. Contrairement à une indexation après chargement en mémoire, cette méthode permet de désigner le fichier SASHDAT comme entrée de l'action `index` via le paramètre `table`. Cela optimise l'utilisation des ressources, car l'action lit le fichier directement depuis le disque plutôt que de requérir le chargement complet de la table originale en mémoire. Le résultat de l'opération est une nouvelle table CAS en mémoire avec les colonnes indexées. Cette nouvelle table peut ensuite être sauvegardée sur le disque, remplaçant potentiellement le fichier SASHDAT original ou créant un nouveau fichier, afin de persister l'indexation. L'action `table.tableDetails` est ensuite utilisée pour vérifier la présence et la taille de l'index dans la table résultante.
Analyse des données

Type : CREATION_INTERNE


Les exemples utilisent des données générées via des DATA steps SAS et des procédures CAS pour créer des fichiers SASHDAT temporaires à des fins de démonstration, garantissant ainsi l'autonomie de chaque bloc de code.

1 Bloc de code
DATA STEP / table.index Data
Explication :
Cet exemple crée un fichier SASHDAT simple `monfichier_unindexed.sashdat` dans une caslib temporaire. Il utilise ensuite l'action `table.index` pour créer un index sur la colonne 'ID' en spécifiant le fichier SASHDAT directement. La table indexée `monfichier_indexed` est ensuite sauvegardée pour persister l'indexation dans le fichier SASHDAT original. L'action `table.tableDetails` est utilisée pour confirmer que l'index a été créé.
Copié !
1/* Assurez-vous qu'une session CAS est active */
2options cashost="localhost" casport=5570;
3cas casauto;
4 
5/* Crée une caslib temporaire si elle n'existe pas */
6PROC CAS;
7 caslib _all_ assign;
8 BUILTINS.addCaslib / name='mycaslib', path='/tmp/mycaslib', subdirs=TRUE, dataSource={srcType='PATH'};
9QUIT;
10 
11/* 1. Création d'un fichier SASHDAT simple sur disque */
12DATA casuser.monfichier_unindexed;
13 INPUT ID $ Nom $ Valeur;
14 DATALINES;
15 A Jean 100
16 B Marie 150
17 C Pierre 200
18 D Anne 120
19 ;
20RUN;
21 
22PROC CASUTIL;
23 save casuser.monfichier_unindexed / caslib='mycaslib' replace;
24QUIT;
25 
26/* 2. Indexation d'une seule colonne du fichier SASHDAT */
27PROC CAS;
28 TABLE.index /
29 TABLE={name='monfichier_unindexed.sashdat', caslib='mycaslib'},
30 casout={name='monfichier_indexed', replace=TRUE, indexVars={'ID'}};
31RUN;
32 
33/* 3. Sauvegarde de la table indexée, remplaçant l'originale pour persister l'index */
34 TABLE.save /
35 TABLE='monfichier_indexed',
36 name='monfichier_unindexed.sashdat',
37 caslib='mycaslib',
38 replace=TRUE;
39RUN;
40 
41/* 4. Vérification de l'indexation (optionnel) */
42 TABLE.tableDetails / TABLE={name='monfichier_indexed', caslib='mycaslib'};
43RUN;
44QUIT;
45 
2 Bloc de code
DATA STEP / table.index Data
Explication :
Cet exemple illustre l'indexation de plusieurs colonnes ('Produit', 'Region') d'un fichier SASHDAT. Après la création et la sauvegarde du fichier `ventes_unindexed.sashdat`, l'action `table.index` crée un index composite. `table.tableDetails` est ensuite utilisée pour afficher les informations détaillées de la table en mémoire `ventes_indexed`, confirmant la présence et la configuration du nouvel index, y compris sa taille.
Copié !
1/* Assurez-vous qu'une session CAS est active */
2options cashost="localhost" casport=5570;
3cas casauto;
4 
5/* Crée une caslib temporaire si elle n'existe pas */
6PROC CAS;
7 caslib _all_ assign;
8 BUILTINS.addCaslib / name='mycaslib', path='/tmp/mycaslib', subdirs=TRUE, dataSource={srcType='PATH'};
9QUIT;
10 
11/* 1. Création d'un autre fichier SASHDAT sur disque */
12DATA casuser.ventes_unindexed;
13 INPUT Produit $ Region $ Montant;
14 DATALINES;
15 A Est 1000
16 B Ouest 1500
17 A Nord 800
18 C Sud 2200
19 B Est 1100
20 ;
21RUN;
22 
23PROC CASUTIL;
24 save casuser.ventes_unindexed / caslib='mycaslib' replace;
25QUIT;
26 
27/* 2. Indexation de plusieurs colonnes */
28PROC CAS;
29 TABLE.index /
30 TABLE={name='ventes_unindexed.sashdat', caslib='mycaslib'},
31 casout={name='ventes_indexed', replace=TRUE, indexVars={'Produit', 'Region'}};
32RUN;
33 
34/* 3. Sauvegarde de la table indexée */
35 TABLE.save /
36 TABLE='ventes_indexed',
37 name='ventes_unindexed.sashdat',
38 caslib='mycaslib',
39 replace=TRUE;
40RUN;
41 
42/* 4. Affichage des détails de la table pour confirmer l'index */
43 TABLE.tableDetails / TABLE={name='ventes_indexed', caslib='mycaslib'};
44RUN;
45QUIT;
46 
3 Bloc de code
DATA STEP / table.index / table.loadTable Data
Explication :
Cet exemple avancé montre comment créer un index sur un fichier SASHDAT de grande taille et le recharger en mémoire avec l'index intact. Après la création d'un large jeu de données `grandedonnees_unindexed.sashdat` et son indexation sur 'ID' et 'Groupe', la table indexée est sauvegardée. La table en mémoire est ensuite supprimée pour simuler un nouveau départ. Enfin, la table est rechargée en mémoire via `table.loadTable`, et `table.tableDetails` confirme que l'indexation a bien été conservée lors de la persistance et du rechargement, démontrant l'efficacité de cette approche pour les grands volumes.
Copié !
1/* Assurez-vous qu'une session CAS est active */
2options cashost="localhost" casport=5570;
3cas casauto;
4 
5/* Crée une caslib temporaire si elle n'existe pas */
6PROC CAS;
7 caslib _all_ assign;
8 BUILTINS.addCaslib / name='mycaslib', path='/tmp/mycaslib', subdirs=TRUE, dataSource={srcType='PATH'};
9QUIT;
10 
11/* 1. Création d'un fichier SASHDAT de plus grande taille */
12DATA casuser.grandedonnees_unindexed;
13 DO i = 1 to 100000;
14 ID = i;
15 Groupe = ceil(i / 1000);
16 Valeur = ranuni(0) * 1000;
17 OUTPUT;
18 END;
19RUN;
20 
21PROC CASUTIL;
22 save casuser.grandedonnees_unindexed / caslib='mycaslib' replace;
23QUIT;
24 
25/* 2. Indexation de colonnes clés directement depuis le fichier SASHDAT sur disque */
26PROC CAS;
27 TABLE.index /
28 TABLE={name='grandedonnees_unindexed.sashdat', caslib='mycaslib'},
29 casout={name='grandedonnees_indexed', replace=TRUE, indexVars={'ID', 'Groupe'}};
30RUN;
31 
32/* 3. Sauvegarde de la table indexée, pour persister l'index sur disque */
33 TABLE.save /
34 TABLE='grandedonnees_indexed',
35 name='grandedonnees_unindexed.sashdat',
36 caslib='mycaslib',
37 replace=TRUE;
38RUN;
39 
40/* 4. Nettoyage de la table en mémoire pour simuler un rechargement */
41 TABLE.dropTable / name='grandedonnees_indexed';
42RUN;
43 
44/* 5. Chargement de la table SASHDAT qui inclut maintenant l'index */
45 TABLE.loadTable /
46 caslib='mycaslib',
47 path='grandedonnees_unindexed.sashdat',
48 casout={name='grandedonnees_reloaded', replace=TRUE};
49RUN;
50 
51/* 6. Vérification que la table rechargée possède bien l'index */
52 TABLE.tableDetails / TABLE={name='grandedonnees_reloaded', caslib='mycaslib'};
53RUN;
54QUIT;
55 
4 Bloc de code
DATA STEP / table.upload / table.index Data
Explication :
Cet exemple démontre comment travailler avec des fichiers SASHDAT depuis le système de fichiers vers CAS. Un fichier SASHDAT est d'abord créé localement, puis chargé dans une table CAS en mémoire. L'action `table.index` est ensuite appliquée à cette table CAS en mémoire pour créer une nouvelle table CAS avec les index désirés. Enfin, cette table CAS indexée est sauvegardée dans un nouveau fichier SASHDAT sur disque, intégrant l'indexation. `table.tableDetails` est utilisé pour confirmer l'index sur la table CAS en mémoire.
Copié !
1/* Assurez-vous qu'une session CAS est active */
2options cashost="localhost" casport=5570;
3cas casauto;
4 
5/* Crée une caslib temporaire si elle n'existe pas */
6PROC CAS;
7 caslib _all_ assign;
8 BUILTINS.addCaslib / name='mycaslib', path='/tmp/mycaslib', subdirs=TRUE, dataSource={srcType='PATH'};
9QUIT;
10 
11/* 1. Création d'un fichier SASHDAT local */
12DATA _null_;
13 file '/tmp/mycaslib/data_locale_unindexed.sashdat';
14 DO i = 1 to 5000;
15 ID = i;
16 Categorie = ceil(i / 1000);
17 Value = rannor(0);
18 OUTPUT;
19 END;
20RUN;
21 
22/* 2. Chargement du fichier SASHDAT dans CAS en tant que table en mémoire */
23PROC CASUTIL;
24 load DATA='/tmp/mycaslib/data_locale_unindexed.sashdat' outcaslib='mycaslib' casout='data_locale_cas' replace;
25QUIT;
26 
27/* 3. Création d'une nouvelle table CAS indexée à partir de la table en mémoire */
28PROC CAS;
29 TABLE.index /
30 TABLE={name='data_locale_cas', caslib='mycaslib'},
31 casout={name='data_locale_cas_indexed', replace=TRUE, indexVars={'ID', 'Categorie'}};
32RUN;
33 
34/* 4. Vérification de l'indexation de la nouvelle table CAS */
35 TABLE.tableDetails / TABLE={name='data_locale_cas_indexed', caslib='mycaslib'};
36RUN;
37 
38/* 5. Sauvegarde de la table CAS indexée vers un fichier SASHDAT */
39 TABLE.save /
40 TABLE='data_locale_cas_indexed',
41 name='data_locale_indexed.sashdat',
42 caslib='mycaslib',
43 replace=TRUE;
44RUN;
45QUIT;
46 
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.
Informations de Copyright : Copyright © SAS Institute Inc. All Rights Reserved. Last updated: January 5, 2022


Banner
Le Conseil de l'Expert
Expert
Michael
Responsable de l'infrastructure Viya.
« L'indexation est souvent perçue comme une opération coûteuse, mais ce script démontre comment l'intégrer proprement dans un pipeline de données. Le point critique ici est la boucle de persistance : Indexation → Sauvegarde → Rechargement.

En remplaçant le fichier SASHDAT original par sa version indexée, vous transformez une table 'brute' en une ressource optimisée pour l'ensemble de l'organisation. L'utilisation systématique de table.tableDetails est une excellente pratique de gouvernance : elle permet de monitorer la taille des index et de valider que les colonnes de haute cardinalité sont correctement traitées pour accélérer les futurs traitements analytiques »