Guía SAS VIYA

SAS Viya: Cómo gestionar nombres de CASLIB de más de 8 caracteres a través de la API REST

Simon 26/08/2024 3 Aufrufe

La automatización de tareas analíticas a través de la API REST de SAS© Viya es una práctica común para integrar la potencia de SAS© en pipelines externos. Sin embargo, un error frecuente ocurre al usar la acción runCode para manipular tablas ubicadas en bibliotecas CAS (Caslibs) cuyo nombre excede el límite histórico de 8 caracteres.

Este artículo detalla el origen de esta limitación y presenta la sintaxis correcta para solucionar el problema sin tener que renombrar sus bibliotecas.

Illustration

El Problema: El límite de 8 caracteres

Cuando envía código Data Step a través de una solicitud HTTP POST al endpoint runCode de CAS, podría verse tentado a usar la sintaxis clásica de dos niveles (Libref.Tabla).

Si el nombre de su biblioteca (Caslib) es largo, por ejemplo mycaslibdatasaviya (que excede ampliamente los 8 caracteres), encontrará el siguiente error si intenta usar una referencia explícita:

ERROR: Caslib 'mycaslibdatasaviya' exceeds 8 characters. Use the CASLIB= data set option for caslibs longer than 8 characters.

¿Por qué este error?

En el entorno clásico de SAS©, las referencias de biblioteca (librefs) están estrictamente limitadas a 8 caracteres. Aunque SAS© Viya y CAS admiten nombres de Caslibs mucho más largos, el intérprete de Data Step invocado por runCode conserva algunas restricciones sintácticas heredadas cuando se utiliza la notación Biblioteca.Tabla.

Además, intentar definir un LIBNAME dentro de la llamada runCode (ej: libname myref cas caslib=mycaslibdatasaviya ...) a menudo fallará con un error que indica que la instrucción no es válida o está mal ubicada, ya que LIBNAME es una instrucción global que no se puede ejecutar en el contexto restringido de la acción runCode.

La Solución: La opción de tabla CASLIB=

La documentación y los mensajes de error sugieren usar "la opción de conjunto de datos CASLIB=". En la práctica, esto significa que en lugar de prefijar el nombre de la tabla con el nombre de la biblioteca, debe especificar la biblioteca como una opción entre paréntesis justo después del nombre de la tabla.

Este método permite superar por completo el límite de 8 caracteres y funciona para todos los nombres de Caslibs, sin importar su longitud.

Sintaxis incorrecta (causa el error)

En este ejemplo, el uso del punto (.) para separar la biblioteca de la tabla causa el fallo porque mycaslibdatasaviya es demasiado largo para ser interpretado como un libref clásico.

1/* Code qui échoue dans l'appel REST à cause du nom long */
2DATA mycaslibdatasaviya.LAB_RESULTS(append=force);
3 SET mycaslibdatasaviya.data201902;
4RUN;

Sintaxis correcta (La solución)

Para corregirlo, elimine el nombre largo del prefijo y colóquelo explícitamente en la opción caslib=.

1/* Code qui fonctionne parfaitement avec le nom long */
2DATA LAB_RESULTS(append=force caslib='mycaslibdatasaviya');
3 SET data201902(caslib='mycaslibdatasaviya');
4RUN;

Implementación en la llamada REST

Así es como se ve el cuerpo JSON final de su solicitud de API con la corrección aplicada. Tenga en cuenta que ya no necesitamos crear referencias temporales.

New Buffer RO
{
"code": "data LAB_RESULTS_CLASSIFICATION(append=force caslib='mycaslibdatasaviya'); set data201902(caslib='mycaslibdatasaviya'); run;"
}
~
~

Resumen

  1. No utilice la notación LongCaslibName.TableName en la acción runCode.

  2. No intente ejecutar una instrucción LIBNAME dentro de un runCode.

  3. Utilice la opción (caslib='NombreDeSuCaslib') directamente después del nombre de la tabla.

Este enfoque es más robusto, estandarizado y le evita los quebraderos de cabeza relacionados con los límites de caracteres heredados.