Publié le :

Définition et Gestion d'Actions CAS Définies par l'Utilisateur

Ce code est également disponible en : Deutsch English Español
En attente de validation
Attention : Ce code nécessite des droits administrateur.
Ce script utilise `PROC CAS` et le langage CASL pour créer un ensemble d'actions personnalisées nommé 'tableSizeHuman'. Cet ensemble contient trois actions :
1. tableStats: Calcule la taille et les détails de compression d'une table CAS (en Ko, Mo, Go, To) et fournit les fréquences des types de données des colonnes en utilisant `table.tableInfo`, `table.tableDetails`, `table.fetch` avec des variables calculées, `table.columnInfo` et `simple.freq`.
2. profCols: Profile des colonnes sélectionnées d'une table CAS via l'action `dataDiscovery.profile`.
3. imageMelt: Combine des détections de traitement d'images avec des données d'images recadrées en effectuant des opérations `transpose.transpose` et une jointure `fedsql.execdirect`.
En outre, le script crée une nouvelle CASLIB nommée 'UDAS' pointant vers un chemin spécifique (`/viyafiles/sasss1/userDefinedActionSets`) et y persiste l'ensemble d'actions 'tableSizeHuman' sous forme de fichier `.sashdat`, assurant sa disponibilité pour d'autres sessions CAS.
Analyse des données

Type : MIXTE


Les actions définies par l'utilisateur traitent des tables CAS existantes dont les noms et les caslibs sont passés en paramètres (par exemple, 'caslib' et 'table'). Le script ne crée pas de données source brutes, mais il génère des tables temporaires dans CAS pour ses calculs intermédiaires. La CASLIB 'UDAS' est créée pour stocker les définitions des actions elles-mêmes, et non pour stocker des données d'entrée au sens traditionnel. Le code commenté suggère l'utilisation de tables comme 'baseball' qui sont supposées exister dans CAS.

1 Bloc de code
PROC CAS
Explication :
Ce bloc initialise une session CAS et assigne toutes les bibliothèques CAS existantes. Il définit ensuite un ensemble d'actions CAS personnalisées nommé 'tableSizeHuman' contenant trois actions : 'tableStats' pour calculer la taille des tables et les fréquences des types de données, 'profCols' pour profiler les colonnes, et 'imageMelt' pour fusionner les données de détection et d'images. Chaque action utilise des fonctions CASL et des actions CAS natives (`table.tableInfo`, `table.tableDetails`, `table.fetch`, `table.columnInfo`, `simple.freq`, `dataDiscovery.profile`, `transpose.transpose`, `fedsql.execdirect`) pour accomplir sa tâche. Ces actions sont écrites en CASL et sont exécutées au sein de la PROC CAS.
Copié !
1cas;
2caslib _all_ assign;
3/* Orginal code authored by Chris Ricciardi */
4/* TB, compressedKB,compressedMB,compressedGB,compressedTB added by Steven Sober */
5/* You must modify the path in the CASLIB USDA at the bottom of the code */
6 
7PROC CAS;
8 BUILTINS.defineActionSet /
9 name="tableSizeHuman"
10 actions={
11 {
12 name="tableStats"
13 desc="Multiple Table actions with calculation of CAS table size and datatype frequency count"
14 parms={
15 {name="caslib" type="string" required=TRUE}
16 {name="table" type="string" required=TRUE}
17 {name="level" type="string" required=FALSE default="sum"}
18 }
19 definition = "
20 table.tableInfo result=r status=s /
21 caslib=caslib
22 name=table;
23 if 0 != s.severity then do;
24 send_response(s);
25 end;
26 send_response(r);
27 run;
28 
29 table.tableDetails result=r status=s /
30 caslib=caslib
31 name=table
32 level=level;
33 if 0 != s.severity then do;
34 send_response(s);
35 end;
36 send_response(r);
37 run;
38 
39 details = findTable(r);
40 saveresult details caslib=caslib casout='casdatasize' replace;
41 
42 table.fetch result=r status=s /
43 table={caslib=caslib name='casdatasize'
44 computedVars={name='KB',name='MB',name='GB',name='TB',
45 name='compressedKB',name='compressedMB',name='compressedGB',name='compressedTB'}
46 computedVarsProgram='
47 KB=round(DataSize / (1024),0.01);
48 MB=round(DataSize / (1024*1024),0.01);
49 GB=round(DataSize / (1024*1024*1024),0.01);
50 TB=round(DataSize / (1024*1024*1024*1024),0.01);
51 compressedKB=round(CompressedSize / (1024),0.01);
52 compressedMB=round(CompressedSize / (1024*1024),0.01);
53 compressedGB=round(CompressedSize / (1024*1024*1024),0.01);
54 compressedTB=round(CompressedSize / (1024*1024*1024*1024),0.01);
55 '}
56 fetchVars={'DataSize', 'VardataSize', 'KB', 'MB', 'GB', 'TB',
57 'CompressedSize', 'compressedKB', 'compressedMB', 'compressedGB', 'compressedTB'};
58
59 if 0 != s.severity then do;
60 send_response(s);
61 end;
62 send_response(r);
63 run;
64 
65 /*size = round((details[1,6] + details[1,7]) / (1024*1024),0.01);
66 print (string)size || 'MB';
67 run;*/
68 
69 table.columnInfo result=r status=s /
70 table={caslib=caslib name=table};
71 if 0 != s.severity then do;
72 send_response(s);
73 end;
74 send_response(r);
75 run;
76 
77 columns = findTable(r);
78 saveresult columns caslib=caslib casout='cascolumns' replace;
79 
80 simple.freq result=r status=s /
81 table={caslib=caslib name='cascolumns'}
82 inputs={{name='type'}};
83 if 0 != s.severity then do;
84 send_response(s);
85 end;
86 send_response(r);
87 run;
88 "
89 },
90 {
91 name="profCols"
92 desc="Profile selected columns"
93 parms={
94 {name="caslib" type="string" required=TRUE}
95 {name="table" type="string" required=TRUE}
96 {name="col" type="string" unkeyedList=TRUE required=TRUE}
97 }
98 definition = "
99 dataDiscovery.profile result=r status=s /
100 table={name=table, caslib=caslib},
101 casOut={caslib=caslib, name='profcols', replication=0, replace=True},
102 columns=col,
103 frequencies=2,
104 minmax=2;
105 if 0 != s.severity then do;
106 send_response(s);
107 end;
108 send_response(r);
109 "
110 },
111 {
112 name="imageMelt"
113 desc="Combine image processing detections with cropped images"
114 parms={
115 {name="caslib" type="string" required=TRUE}
116 {name="detections" type="string" required=TRUE}
117 {name="cropped" type="string" required=TRUE}
118 {name="casout" type="string" required=TRUE}
119 }
120 definition = "
121 table.columnInfo result=r /
122 table={name=detections caslib=caslib};
123 col_info = findTable(r);
124 varlist = {};
125 do colname over col_info;
126 if length(colname.Column) ge 7 then do;
127 obj = substr(colname.Column,1,7);
128 end;
129 if obj = '_Object' then do;
130 tempVar=colname.Column;
131 varlist = varlist + {tempVar};
132 end;
133 end;
134 run;
135 
136 /*print varlist;
137 run;*/
138 
139 transpose.transpose / table ={name=detections caslib=caslib groupBy = {'_id_', '_filename_0', '_nObjects_'}
140 computedVars={name='idvalue'}
141 computedVarsProgram='idvalue=""Values""'}
142 casout = {name='obj_melted' caslib=caslib replace=true replication=0}
143 id = {'idvalue'}
144 let = 0
145 transpose = varlist
146 name = 'ColName';
147 run;
148 
149 transpose.transpose / table={name='obj_melted' caslib=caslib groupby={'_id_', 'object', '_filename_0', '_nObjects_'}
150 computedVars={{name='object'},{name='type'}}
151 computedVarsProgram=""object=substr(ColName,8,(index(substr(ColName,2),'_')-7));
152 if type = substr(ColName,(index(substr(ColName,2),'_')+2)) = ''
153 then type = 'objname';
154 else type = substr(ColName,(index(substr(ColName,2),'_')+2));""}
155 casout={name='obj_melted2' caslib=caslib replace=true replication=0}
156 id={'type'}
157 transpose = {'Values'}
158 let = False;
159 run;
160 
161 table.tableInfo result=r /
162 name=cropped;
163 tinfo = findTable(r);
164 crop = tinfo[1,1];
165 /*print 'crop is ' crop;*/
166 clib = tinfo[1,18];
167 /*print 'clib is ' clib;*/
168 run;
169 
170 qstring = 'create TABLE ' || clib || '.' || casout || ' {options replace=true replication=0} as select
171 t1.*, t2._filename_0, t2._nObjects_, /*cast(t2.object as double) as object,*/ t2.objname,
172 cast(t2.height as double) as height, cast(t2.width as double) as width,
173 cast(t2.x as double) as x, cast(t2.y as double) as y
174 from ' || clib || '.' || crop || ' t1 left join ' || clib || '.obj_melted2 t2
175 on (t1._parentId_ = t2._id_ and t1._id_ = cast(t2.object as double))';
176 /*print qstring;*/
177 run;
178 
179 fedsql.execdirect /
180 query=qstring;
181 run;
182 
183 table.tableInfo result=r status=s /
184 caslib=caslib
185 name='obj_joined';
186 if 0 != s.severity then do;
187 send_response(s);
188 end;
189 send_response(r);
190 run;
191 
192 table.dropTable / caslib=caslib name='obj_melted';
193 run;
194 table.dropTable / caslib=caslib name='obj_melted2';
195 run;
196 "
197 }
198 }
199 ;
200RUN;
201QUIT;
Résultat Visuel
Result
2 Bloc de code
PROC CAS Data
Explication :
Ce bloc ajoute une nouvelle bibliothèque CAS (CASLIB) nommée 'UDAS' qui pointe vers un chemin système spécifique (`/viyafiles/sasss1/userDefinedActionSets`). L'objectif de cette CASLIB est de stocker des fichiers persistants pour les actions définies par l'utilisateur. Ensuite, il utilise l'action `builtins.actionSetToTable` pour convertir l'ensemble d'actions 'tableSizeHuman' précédemment défini en une table CAS persistante dans la CASLIB 'UDAS'. Enfin, l'action `table.save` est utilisée pour sauvegarder cette table CAS sous forme de fichier `tableSizeHuman.sashdat` sur le contrôleur CAS, rendant l'ensemble d'actions défini par l'utilisateur disponible pour les futures sessions CAS.
Copié !
1PROC CAS;
2 TABLE.addCaslib /
3 caslib='UDAS'
4 dataSource={srctype='path'}
5 path="/viyafiles/sasss1/userDefinedActionSets";
6RUN;
7QUIT;
8 
9PROC CAS;
10 BUILTINS.actionSetToTable /
11 actionSet="tableSizeHuman"
12 casOut={caslib="UDAS" name="tableSizeHuman" replace=True};
13RUN;
14 TABLE.save /
15 caslib="UDAS"
16 TABLE="tableSizeHuman"
17 name="tableSizeHuman.sashdat"
18 replace=True;
19QUIT;
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 © 2021, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. SPDX-License-Identifier: Apache-2.0