Die Aktion fedsql.execdirect ermöglicht das direkte Senden von SQL-Abfragen an den CAS-Server. Durch Angabe des Parameters 'showStages=true' kann ein detaillierter Bericht des Abfrage-Ausführungsplans abgerufen werden. Dieser Bericht unterteilt die Ausführung in mehrere Phasen, zeigt die verwendeten Methoden (z. B. Sortierung, Aggregation, sequenzielles Scannen), die für jede Phase generierte SQL-Abfrage (stage query), die Anzahl der Datenzugriffs-Threads pro Worker, die Eingabetabellen mit ihren Eigenschaften (Anzahl der Zeilen, Spalten, Partitionierung) und die Ausführungszeiten für jede Phase und für die gesamte Abfrage. Diese Informationen sind entscheidend für die Optimierung von Abfragen und das Verständnis des Verhaltens von FedSQL auf der verteilten Architektur von CAS.
Datenanalyse
Type : INTERNE ERSTELLUNG
Die Beispiele verwenden eine intern mit einem DATA Step erstellte Tabelle 'crimeCensus' mit fiktiven Daten, um das in der Dokumentation beschriebene Verhalten zu simulieren.
1 Codeblock
DATA STEP / FEDSQL.EXECDIRECT Data
Erklärung : Dieses minimale Beispiel erstellt eine temporäre Tabelle 'crimeCensus' in CASUSER mit fiktiven Daten. Anschließend wird eine einfache FedSQL-Abfrage ausgeführt, die die Anzahl der Vorkommen für jeden 'primary_type' zählt und die Ergebnisse absteigend nach der Anzahl sortiert. Der Parameter 'showStages' wird hier nicht verwendet, um die grundlegende Verwendung der Aktion zu veranschaulichen.
Kopiert!
data casuser.crimeCensus;
infile datalines dlm=';';
input primary_type $ date :yymmdd10. community_area hardship_index per_capita_income;
format date yymmdd10.;
datalines;
THEFT;2015-01-15;10;80;25000
THEFT;2015-02-20;10;80;25000
THEFT;2015-03-01;10;80;25000
THEFT;2015-04-10;10;80;25000
THEFT;2015-05-05;10;80;25000
THEFT;2016-01-20;10;80;25000
THEFT;2016-02-25;10;80;25000
THEFT;2016-03-05;10;80;25000
THEFT;2016-04-15;10;80;25000
THEFT;2016-05-10;10;80;25000
ASSAULT;2015-01-01;20;70;30000
ASSAULT;2015-01-02;20;70;30000
ASSAULT;2015-01-03;20;70;30000
ASSAULT;2015-01-04;20;70;30000
ASSAULT;2015-01-05;20;70;30000
ROBBERY;2016-06-01;30;90;20000
ROBBERY;2016-06-02;30;90;20000
ROBBERY;2016-06-03;30;90;20000
ROBBERY;2016-06-04;30;90;20000
ROBBERY;2016-06-05;30;90;20000
;
run;
proc cas;
fedsql.execdirect
query="select primary_type, count(*) as count from crimeCensus group by primary_type order by count desc";
quit;
1
DATA casuser.crimeCensus;
2
INFILEDATALINES dlm=';';
3
INPUT primary_type $ date :yymmdd10. community_area hardship_index per_capita_income;
4
FORMAT date yymmdd10.;
5
DATALINES;
6
THEFT;2015-01-15;10;80;25000
7
THEFT;2015-02-20;10;80;25000
8
THEFT;2015-03-01;10;80;25000
9
THEFT;2015-04-10;10;80;25000
10
THEFT;2015-05-05;10;80;25000
11
THEFT;2016-01-20;10;80;25000
12
THEFT;2016-02-25;10;80;25000
13
THEFT;2016-03-05;10;80;25000
14
THEFT;2016-04-15;10;80;25000
15
THEFT;2016-05-10;10;80;25000
16
ASSAULT;2015-01-01;20;70;30000
17
ASSAULT;2015-01-02;20;70;30000
18
ASSAULT;2015-01-03;20;70;30000
19
ASSAULT;2015-01-04;20;70;30000
20
ASSAULT;2015-01-05;20;70;30000
21
ROBBERY;2016-06-01;30;90;20000
22
ROBBERY;2016-06-02;30;90;20000
23
ROBBERY;2016-06-03;30;90;20000
24
ROBBERY;2016-06-04;30;90;20000
25
ROBBERY;2016-06-05;30;90;20000
26
;
27
RUN;
28
29
PROC CAS;
30
fedsql.execdirect
31
query="select primary_type, count(*) as count from crimeCensus group by primary_type order by count desc";
32
QUIT;
33
2 Codeblock
FEDSQL.EXECDIRECT
Erklärung : Dieses Beispiel reproduziert den in der Dokumentation angegebenen Anwendungsfall. Es wird eine komplexere FedSQL-Abfrage übermittelt, die nach Kriminalitätstyp ('THEFT') und einem Datumsbereich filtert, nach mehreren Variablen gruppiert und eine 'HAVING'-Bedingung enthält. Der Parameter 'showStages=true' ist aktiviert, um die Details des Ausführungsplans zu erhalten, die die verschiedenen Schritte der Abfrageverarbeitung auf dem CAS-Server zeigen.
Kopiert!
proc cas;
fedsql.execdirect
showStages=true
query="select primary_type, count(*) as count, community_area,
hardship_index, per_capita_income from crimeCensus
where primary_type='THEFT'
and date between date '2015-01-01' and date'2016-01-01'
group by primary_type, community_area, hardship_index, per_capita_income
having count(*) >= 5
order by count desc";
quit;
1
PROC CAS;
2
fedsql.execdirect
3
showStages=true
4
query="select primary_type, count(*) as count, community_area,
5
hardship_index, per_capita_income from crimeCensus
6
where primary_type='THEFT'
7
and date between date '2015-01-01' and date'2016-01-01'
8
group by primary_type, community_area, hardship_index, per_capita_income
9
having count(*) >= 5
10
order by count desc";
11
QUIT;
3 Codeblock
FEDSQL.EXECDIRECT
Erklärung : Dieses fortgeschrittene Beispiel führt einen Join zwischen der Tabelle 'crimeCensus' (erstellt in Beispiel 1) und einer neuen Tabelle 'population_data' ein. Die Abfrage berechnet die Gesamtzahl der Vorfälle und die Vorfallsrate pro 1000 Einwohner für spezifische Kriminalitätstypen über einen längeren Zeitraum. Die Verwendung von 'showStages=true' ermöglicht die Analyse des Ausführungsplans für diese Multi-Tabellen-Abfrage, einschließlich der Art und Weise, wie der Join und komplexe Berechnungen von FedSQL auf CAS gehandhabt werden.
Kopiert!
data casuser.population_data;
infile datalines dlm=';';
input community_area $ population;
datalines;
10;50000
20;75000
30;60000
;
run;
proc cas;
fedsql.execdirect
showStages=true
query="select c.primary_type, count(c.*) as total_incidents,
c.community_area, p.population,
(count(c.*) * 1000 / p.population) as incidents_per_1000
from crimeCensus as c
join population_data as p
on c.community_area = p.community_area
where c.primary_type in ('THEFT', 'ROBBERY')
and c.date between date '2015-01-01' and date '2016-12-31'
group by c.primary_type, c.community_area, p.population
having count(c.*) >= 2
order by incidents_per_1000 desc";
quit;
1
DATA casuser.population_data;
2
INFILEDATALINES dlm=';';
3
INPUT community_area $ population;
4
DATALINES;
5
10;50000
6
20;75000
7
30;60000
8
;
9
RUN;
10
11
PROC CAS;
12
fedsql.execdirect
13
showStages=true
14
query="select c.primary_type, count(c.*) as total_incidents,
15
c.community_area, p.population,
16
(count(c.*) * 1000 / p.population) as incidents_per_1000
17
from crimeCensus as c
18
join population_data as p
19
on c.community_area = p.community_area
20
where c.primary_type in ('THEFT', 'ROBBERY')
21
and c.date between date '2015-01-01' and date '2016-12-31'
22
group by c.primary_type, c.community_area, p.population
23
having count(c.*) >= 2
24
order by incidents_per_1000 desc";
25
QUIT;
4 Codeblock
FEDSQL.EXECDIRECT / TABLE.REPLICATE
Erklärung : Dieses Beispiel konzentriert sich auf die Viya/CAS-Integration, indem die Tabelle 'crimeCensus' (zu Demonstrationszwecken wird die Tabelle bei Bedarf zuerst neu erstellt) im CAS-Server-Speicher mithilfe der Aktion 'table.replicate' repliziert wird. Die Replikation kann die Leistung für kleine, häufig aufgerufene Tabellen verbessern. Anschließend wird eine FedSQL-Abfrage auf der replizierten Tabelle mit 'showStages=true' ausgeführt, um zu beobachten, wie der Ausführungsplan die replizierte Tabelle nutzt (z. B. 'Replicated to one worker' in der Planausgabe), was eine effizientere Datenzugriffszeit zeigen kann.
Kopiert!
proc cas;
/* Créer la table crimeCensus si elle n'existe pas déjà (dupliqué pour l'autonomie) */
data casuser.crimeCensus;
infile datalines dlm=';';
input primary_type $ date :yymmdd10. community_area hardship_index per_capita_income;
format date yymmdd10.;
datalines;
THEFT;2015-01-15;10;80;25000
THEFT;2015-02-20;10;80;25000
THEFT;2015-03-01;10;80;25000
THEFT;2015-04-10;10;80;25000
THEFT;2015-05-05;10;80;25000
THEFT;2016-01-20;10;80;25000
THEFT;2016-02-25;10;80;25000
THEFT;2016-03-05;10;80;25000
THEFT;2016-04-15;10;80;25000
THEFT;2016-05-10;10;80;25000
ASSAULT;2015-01-01;20;70;30000
ASSAULT;2015-01-02;20;70;30000
ASSAULT;2015-01-03;20;70;30000
ASSAULT;2015-01-04;20;70;30000
ASSAULT;2015-01-05;20;70;30000
ROBBERY;2016-06-01;30;90;20000
ROBBERY;2016-06-02;30;90;20000
ROBBERY;2016-06-03;30;90;20000
ROBBERY;2016-06-04;30;90;20000
ROBBERY;2016-06-05;30;90;20000
;
run;
/* Répliquer la table crimeCensus dans CAS pour une meilleure performance */
table.replicate /
name='crimeCensus',
caslib='casuser',
target='crimeCensus_replicated',
numreplicas=1; /* Répliquer sur un seul worker pour une petite table */
/* Exécuter une requête FedSQL sur la table répliquée avec showStages */
fedsql.execdirect
showStages=true
query="select primary_type, count(*) as count from crimeCensus_replicated group by primary_type order by count desc";
quit;
1
PROC CAS;
2
/* Créer la table crimeCensus si elle n'existe pas déjà (dupliqué pour l'autonomie) */
3
DATA casuser.crimeCensus;
4
INFILEDATALINES dlm=';';
5
INPUT primary_type $ date :yymmdd10. community_area hardship_index per_capita_income;
6
FORMAT date yymmdd10.;
7
DATALINES;
8
THEFT;2015-01-15;10;80;25000
9
THEFT;2015-02-20;10;80;25000
10
THEFT;2015-03-01;10;80;25000
11
THEFT;2015-04-10;10;80;25000
12
THEFT;2015-05-05;10;80;25000
13
THEFT;2016-01-20;10;80;25000
14
THEFT;2016-02-25;10;80;25000
15
THEFT;2016-03-05;10;80;25000
16
THEFT;2016-04-15;10;80;25000
17
THEFT;2016-05-10;10;80;25000
18
ASSAULT;2015-01-01;20;70;30000
19
ASSAULT;2015-01-02;20;70;30000
20
ASSAULT;2015-01-03;20;70;30000
21
ASSAULT;2015-01-04;20;70;30000
22
ASSAULT;2015-01-05;20;70;30000
23
ROBBERY;2016-06-01;30;90;20000
24
ROBBERY;2016-06-02;30;90;20000
25
ROBBERY;2016-06-03;30;90;20000
26
ROBBERY;2016-06-04;30;90;20000
27
ROBBERY;2016-06-05;30;90;20000
28
;
29
RUN;
30
31
/* Répliquer la table crimeCensus dans CAS pour une meilleure performance */
32
TABLE.replicate /
33
name='crimeCensus',
34
caslib='casuser',
35
target='crimeCensus_replicated',
36
numreplicas=1; /* Répliquer sur un seul worker pour une petite table */
37
38
/* Exécuter une requête FedSQL sur la table répliquée avec showStages */
39
fedsql.execdirect
40
showStages=true
41
query="select primary_type, count(*) as count from crimeCensus_replicated group by primary_type order by count desc";
42
QUIT;
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.
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.