Fedsql

Optimización de SAS Viya: Emular PROC SQL con PROC FedSQL habilitado para CAS

Simon 3 vues

La adopción de SAS© Viya a menudo viene con un objetivo de rendimiento: aprovechar el motor in-memory CAS (Cloud Analytic Services) para acelerar el procesamiento de datos. Para los usuarios acostumbrados a PROC SQL, esto a menudo implica migrar a PROC FedSQL.

Sin embargo, aunque PROC SQL cumple con el estándar ANSI 92, también permite muchas características únicas propias de SAS©. PROC FedSQL, por otro lado, cumple con el estándar ANSI 99 y está optimizado para el procesamiento distribuido, pero no maneja algunas sintaxis implícitas de SAS© de la misma manera.

Este artículo explora cómo refactorizar una lógica condicional clásica de PROC SQL para que funcione eficientemente en un entorno CAS con PROC FedSQL.

Optimización de SAS Viya: Emular PROC SQL con PROC FedSQL habilitado para CAS -

El Desafío: La gestión de los booleanos

En SAS© clásico, un truco común en PROC SQL es sumar el resultado de una expresión booleana. SAS© evalúa una condición verdadera como igual a 1 y una falsa como igual a 0.

Tomemos este ejemplo usando la tabla sashelp.baseball. Queremos contar el número total de elementos y calcular una suma basada en una condición compleja (donde la diferencia absoluta entre los hits y las carreras es inferior al 10% de los turnos al bate).

Código PROC SQL original:

1PROC SQL;
2 create TABLE BenchMark as
3 select count(*) as ItemCount
4 , sum( abs( nhits - nruns ) < 0.1*natbat ) as DIFF_10
5 from sashelp.baseball;
6RUN;
En este código, la expresión abs( nhits - nruns ) < 0.1*natbat devuelve implícitamente 1 o 0, lo que permite que la función SUM funcione directamente.

La Solución: Usar CASE en PROC FedSQL

Cuando pasamos a PROC FedSQL para ejecutar este código de forma distribuida en CAS, esta conversión implícita de booleano a entero no es compatible de la misma manera con el estándar ANSI más estricto. Si intenta ejecutar el código tal cual, fallará o no producirá el resultado esperado.

Para emular este comportamiento, debemos hacer la lógica explícita usando una instrucción CASE.

Código PROC FedSQL refactorizado para CAS:

1PROC FEDSQL sessref=casauto;
2 create TABLE BenchMark as
3 select count(*) as ItemCount
4 , sum(case
5 when (abs (nhits - nruns ) < (0.1*natbat)) is true THEN 1
6 END
7 ) as DIFF_10
8 from baseball;
9QUIT;

Análisis de los cambios

  1. Instrucción CASE: Hemos encapsulado la condición en una estructura CASE ... WHEN ... THEN ... END.

  2. Explicitación: La cláusula WHEN ... IS TRUE THEN 1 obliga al motor a devolver el valor numérico 1 cuando se cumple la condición. Si la condición es falsa, el CASE devuelve implícitamente NULL (o se podría añadir un ELSE 0), que es ignorado por la función SUM, reproduciendo así el comportamiento del PROC SQL original.

  3. Ejecución CAS: Gracias a la opción sessref=casauto (o el nombre de su sesión CAS), este código ahora se ejecuta con la potencia del cálculo distribuido.

El objetivo al migrar a SAS© Viya es usar CAS para acelerar las rutinas existentes. Refactorizar el código PROC SQL a PROC FedSQL es un excelente método para lograrlo, siempre que se dominen los matices sintácticos entre los estándares ANSI.

Para el código PROC SQL que resulte demasiado complejo de refactorizar o que utilice funcionalidades de SAS© demasiado específicas no compatibles con FedSQL, siempre es posible ejecutarlo tal cual en el entorno de ejecución de programación de SAS© (SPRE) de Viya.