La acción fedsql.execdirect permite enviar consultas SQL directamente al servidor CAS. Al especificar el parámetro 'showStages=true', es posible obtener un informe detallado del plan de ejecución de la consulta. Este informe desglosa la ejecución en varias etapas, mostrando los métodos utilizados (por ejemplo, clasificación, agregación, barrido secuencial), la consulta SQL generada para cada etapa (stage query), el número de hilos de acceso a datos por worker, las tablas de entrada con sus propiedades (número de filas, columnas, particionamiento), y los tiempos de ejecución para cada etapa y para la consulta global. Esta información es crucial para la optimización de consultas y la comprensión del comportamiento de FedSQL en la arquitectura distribuida de CAS.
Análisis de datos
Type : CREACIÓN_INTERNA
Los ejemplos utilizan una tabla 'crimeCensus' creada internamente con un DATA Step y datos ficticios para simular el comportamiento descrito en la documentación.
1 Bloque de código
DATA STEP / FEDSQL.EXECDIRECT Data
Explicación : Este ejemplo mínimo crea una tabla temporal 'crimeCensus' en CASUSER con datos ficticios. Luego, ejecuta una simple consulta FedSQL que cuenta el número de ocurrencias para cada 'primary_type' y ordena los resultados en orden descendente por conteo. El parámetro 'showStages' no se utiliza aquí para ilustrar el uso básico de la acción.
¡Copiado!
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 Bloque de código
FEDSQL.EXECDIRECT
Explicación : Este ejemplo reproduce el caso de uso proporcionado en la documentación. Envía una consulta FedSQL más compleja, filtrando por tipo de crimen ('THEFT') y un rango de fechas, agrupando por varias variables y con una condición 'HAVING'. El parámetro 'showStages=true' está activado para obtener el detalle del plan de ejecución, mostrando las diferentes etapas del procesamiento de la consulta en el servidor CAS.
¡Copiado!
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 Bloque de código
FEDSQL.EXECDIRECT
Explicación : Este ejemplo avanzado introduce una unión entre la tabla 'crimeCensus' (creada en el ejemplo 1) y una nueva tabla 'population_data'. La consulta calcula el número total de incidentes y la tasa de incidentes por cada 1000 habitantes para tipos de crímenes específicos en un período más largo. El uso de 'showStages=true' permite analizar el plan de ejecución para esta consulta multi-tabla, incluyendo cómo la unión y los cálculos complejos son gestionados por FedSQL en CAS.
¡Copiado!
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 Bloque de código
FEDSQL.EXECDIRECT / TABLE.REPLICATE
Explicación : Este ejemplo se centra en la integración Viya/CAS replicando la tabla 'crimeCensus' (para fines de demostración, la tabla se recrea primero si es necesario) en la memoria del servidor CAS usando la acción 'table.replicate'. La replicación puede mejorar el rendimiento para tablas pequeñas a las que se accede con frecuencia. Luego, se ejecuta una consulta FedSQL en la tabla replicada con 'showStages=true' para observar cómo el plan de ejecución aprovecha la tabla replicada (por ejemplo, 'Replicated to one worker' en la salida del plan), lo que puede mostrar un tiempo de acceso a datos más eficiente.
¡Copiado!
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;
Este material se proporciona "tal cual" por We Are Cas. No hay garantías, expresas o implícitas, en cuanto a la comerciabilidad o idoneidad para un propósito particular con respecto a los materiales o el código contenidos en este documento. We Are Cas no es responsable de los errores en este material tal como existe ahora o existirá, ni We Are Cas proporciona soporte técnico para el mismo.
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.