Guide SAS VIYA

SAS Viya : Comment gérer les noms de CASLIB supérieurs à 8 caractères via l'API REST

Simon 12 vistas
Niveau de difficulté
Confirmé
Publicado el :
Michael

Consejo del experto

Michael

L'ouverture de SAS© Viya™ via ses API REST marque une étape clé dans l'industrialisation de la Data Science. Cependant, ce cas d'usage illustre la rencontre parfois complexe entre deux époques : la flexibilité illimitée des environnements Cloud (CAS) et la rigueur syntaxique héritée du moteur SAS historique.

Cet article met en lumière une subtilité indispensable à connaître : la persistance de la limite des 8 caractères au sein de l'action runCode. Plus qu'une simple correction de bug, la méthode présentée ici (l'option caslib=) est une bonne pratique d'architecture. Elle vous permet de construire des pipelines robustes et lisibles, sans sacrifier la nomenclature descriptive de vos données modernes au profit de contraintes techniques d'un autre temps.

L'automatisation des tâches analytiques via l'API REST de SAS© Viya est une pratique courante pour intégrer la puissance de SAS© dans des pipelines externes. Cependant, une erreur fréquente survient lors de l'utilisation de l'action runCode pour manipuler des tables situées dans des bibliothèques CAS (Caslibs) dont le nom dépasse la limite historique de 8 caractères.

Cet article détaille l'origine de cette limitation et présente la syntaxe correcte pour contourner le problème sans avoir à renommer vos bibliothèques.

SAS Viya : Comment gérer les noms de CASLIB supérieurs à 8 caractères via l'API REST -

Le Problème : La limite des 8 caractères

Lorsque vous soumettez du code Data Step via une requête HTTP POST vers l'endpoint runCode de CAS, vous pourriez être tenté d'utiliser la syntaxe classique à deux niveaux (Libref.Table).

Si votre nom de bibliothèque (Caslib) est long, par exemple mycaslibdatasaviya (qui dépasse largement 8 caractères), vous rencontrerez l'erreur suivante si vous tentez d'utiliser une référence explicite :

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

Pourquoi cette erreur ?

Dans l'environnement SAS© classique, les références de bibliothèques (librefs) sont strictement limitées à 8 caractères. Bien que SAS© Viya et CAS supportent des noms de Caslibs beaucoup plus longs, l'interpréteur Data Step invoqué par runCode conserve certaines contraintes syntaxiques héritées lorsqu'on utilise la notation Bibliothèque.Table.

De plus, tenter de définir une LIBNAME à l'intérieur de l'appel runCode (ex: libname myref cas caslib=mycaslibdatasaviya ...) échouera souvent avec une erreur indiquant que l'instruction n'est pas valide ou mal placée, car LIBNAME est une instruction globale qui ne peut pas être exécutée dans le contexte restreint de l'action runCode.

La Solution : L'option de table CASLIB=

La documentation et les messages d'erreur suggèrent d'utiliser "l'option de data set CASLIB=". Concrètement, cela signifie qu'au lieu de préfixer le nom de la table par le nom de la bibliothèque, vous devez spécifier la bibliothèque comme une option entre parenthèses juste après le nom de la table.

Cette méthode permet de s'affranchir totalement de la limite des 8 caractères et fonctionne pour tous les noms de Caslibs, quelle que soit leur longueur.

Syntaxe incorrecte (provoque l'erreur)

Dans cet exemple, l'utilisation du point (.) pour séparer la bibliothèque de la table provoque l'échec car mycaslibdatasaviya est trop long pour être interprété comme une libref classique.

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

Syntaxe correcte (La solution)

Pour corriger le tir, retirez le nom long du préfixe et placez-le explicitement dans l'option caslib=.

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

Implémentation dans l'appel REST

Voici à quoi ressemble le corps JSON final de votre requête API avec la correction appliquée. Notez que nous n'avons plus besoin de créer de références temporaires.

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

Résumé

  1. N'utilisez pas la notation LongCaslibName.TableName dans l'action runCode.

  2. N'essayez pas d'exécuter une instruction LIBNAME à l'intérieur d'un runCode.

  3. Utilisez l'option (caslib='NomDeVotreCaslib') directement après le nom de la table.

Cette approche est plus robuste, standardisée, et vous évite les casse-têtes liés aux limites de caractères héritées.