Veröffentlicht am :

Definition und Verwaltung von benutzerdefinierten CAS-Aktionen

Dieser Code ist auch verfügbar auf: English Español Français
Wartet auf Validierung
Attention : Dieser Code erfordert Administratorrechte.
Dieses Skript verwendet `PROC CAS` und die CASL-Sprache, um einen Satz benutzerdefinierter Aktionen namens 'tableSizeHuman' zu erstellen. Dieser Satz enthält drei Aktionen:
1. tableStats: Berechnet die Größe und Komprimierungsdetails einer CAS-Tabelle (in KB, MB, GB, TB) und liefert die Häufigkeiten der Datentypen von Spalten unter Verwendung von `table.tableInfo`, `table.tableDetails`, `table.fetch` mit berechneten Variablen, `table.columnInfo` und `simple.freq`.
2. profCols: Profilt ausgewählte Spalten einer CAS-Tabelle über die Aktion `dataDiscovery.profile`.
3. imageMelt: Kombiniert Bildverarbeitungsdetektionen mit zugeschnittenen Bilddaten, indem `transpose.transpose`-Operationen und ein `fedsql.execdirect`-Join durchgeführt werden.
Darüber hinaus erstellt das Skript eine neue CASLIB namens 'UDAS', die auf einen bestimmten Pfad (`/viyafiles/sasss1/userDefinedActionSets`) verweist und dort den Aktionssatz 'tableSizeHuman' als `.sashdat`-Datei persistent speichert, um dessen Verfügbarkeit für andere CAS-Sitzungen zu gewährleisten.
Datenanalyse

Type : MIXTE


Die benutzerdefinierten Aktionen verarbeiten vorhandene CAS-Tabellen, deren Namen und Caslibs als Parameter übergeben werden (z. B. 'caslib' und 'table'). Das Skript erstellt keine rohen Quelldaten, aber es generiert temporäre Tabellen in CAS für seine Zwischenberechnungen. Die CASLIB 'UDAS' wird erstellt, um die Aktionsdefinitionen selbst zu speichern, und nicht, um Eingangsdaten im traditionellen Sinne zu speichern. Der kommentierte Code schlägt die Verwendung von Tabellen wie 'baseball' vor, die in CAS existieren sollen.

1 Codeblock
PROC CAS
Erklärung :
Dieser Block initialisiert eine CAS-Sitzung und weist alle vorhandenen CAS-Bibliotheken zu. Anschließend wird ein benutzerdefinierter CAS-Aktionssatz namens 'tableSizeHuman' definiert, der drei Aktionen enthält: 'tableStats' zur Berechnung der Tabellengrößen und der Häufigkeiten von Datentypen, 'profCols' zum Profiling von Spalten und 'imageMelt' zum Zusammenführen von Erkennungs- und Bilddaten. Jede Aktion verwendet CASL-Funktionen und native CAS-Aktionen (`table.tableInfo`, `table.tableDetails`, `table.fetch`, `table.columnInfo`, `simple.freq`, `dataDiscovery.profile`, `transpose.transpose`, `fedsql.execdirect`), um ihre Aufgabe zu erfüllen. Diese Aktionen sind in CASL geschrieben und werden innerhalb der PROC CAS ausgeführt.
Kopiert!
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;
2 Codeblock
PROC CAS Data
Erklärung :
Dieser Block fügt eine neue CAS-Bibliothek (CASLIB) namens 'UDAS' hinzu, die auf einen bestimmten Systempfad (`/viyafiles/sasss1/userDefinedActionSets`) verweist. Das Ziel dieser CASLIB ist es, persistente Dateien für benutzerdefinierte Aktionen zu speichern. Anschließend wird die Aktion `builtins.actionSetToTable` verwendet, um den zuvor definierten Aktionssatz 'tableSizeHuman' in eine persistente CAS-Tabelle in der CASLIB 'UDAS' umzuwandeln. Schließlich wird die Aktion `table.save` verwendet, um diese CAS-Tabelle als Datei `tableSizeHuman.sashdat` auf dem CAS-Controller zu speichern, wodurch der benutzerdefinierte Aktionssatz für zukünftige CAS-Sitzungen verfügbar gemacht wird.
Kopiert!
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;
Dieses Material wird von We Are Cas "wie besehen" zur Verfügung gestellt. Es gibt keine ausdrücklichen oder stillschweigenden Garantien hinsichtlich der Marktgängigkeit oder Eignung für einen bestimmten Zweck in Bezug auf die hierin enthaltenen Materialien oder Codes. We Are Cas ist nicht verantwortlich für Fehler in diesem Material, wie es jetzt existiert oder existieren wird, noch bietet We Are Cas technischen Support dafür an.
Urheberrechtsinformationen : Copyright © 2021, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. SPDX-License-Identifier: Apache-2.0