Guide SAS VIYA

SAS Viya & Python : Comment remplacer une table globale (Global Table) ?

Simon 20 vues
Niveau de difficulté
Débutant
Publié le :
Michael

Le conseil de l'expert

Michael

Ne vous fiez pas au paramètre replace=True : il est inefficace sur les tables globales promues, car CAS verrouille l'écrasement direct par sécurité. Pour industrialiser vos scripts Python, intégrez systématiquement une étape de nettoyage préalable : invoquez dropTable (avec l'option quiet=True pour ignorer les erreurs si la table est absente) avant de charger votre nouvelle version

L'automatisation des flux de données entre Python et SAS© Viya via l'interface SWAT est une pratique courante. Cependant, une erreur spécifique survient souvent lorsque l'on tente de mettre à jour des données partagées avec l'ensemble des utilisateurs : "Global Table cannot be replaced".

Cet article explique pourquoi cette erreur se produit et la bonne pratique pour mettre à jour vos tables globales sans changer leur nom.

SAS Viya & Python : Comment remplacer une table globale (Global Table) ? -

Voici une proposition d'article technique basé sur les échanges fournis, rédigé pour un blog de développeurs ou une base de connaissances interne.


SAS© Viya & Python : Comment remplacer une table globale (Global Table) ?

L'automatisation des flux de données entre Python et SAS© Viya via l'interface SWAT est une pratique courante. Cependant, une erreur spécifique survient souvent lorsque l'on tente de mettre à jour des données partagées avec l'ensemble des utilisateurs : "Global Table cannot be replaced".

Cet article explique pourquoi cette erreur se produit et la bonne pratique pour mettre à jour vos tables globales sans changer leur nom.

Le Problème : L'écrasement impossible

Imaginez le scénario suivant : vous avez un script Python qui charge un fichier CSV, le transforme, et tente de l'uploader sur le serveur CAS pour le rendre accessible à tout le monde (Promouvoir en Global Scope).

Votre code ressemble probablement à ceci :

New BufferRO
conn.upload('data.csv',
casout=dict(name='ma_table_partagee',
caslib='public',
promote=True,
replace=True))
~
~

Lors de la première exécution, tout fonctionne. Mais dès la seconde exécution, le script échoue avec le message :

ERROR: Global tables cannot be replaced.

Pourquoi ?

Dans l'architecture CAS, les tables "Globales" (celles qui survivent à la fermeture de votre session et sont visibles par tous) bénéficient d'une protection. Les options promote=True et replace=True ne peuvent pas être utilisées simultanément pour écraser une table globale existante. Le système refuse cette opération pour éviter des conflits d'accès concurrents ou des suppressions accidentelles de données critiques.

Les fausses bonnes idées

Face à ce blocage, on est parfois tenté de :

  1. Ne pas remplacer (replace=False) : Cela échouera car la table existe déjà.

  2. Changer le nom de la table cible : Cela fonctionne techniquement, mais c'est ingérable pour les rapports ou les utilisateurs qui s'attendent à trouver une table nommée ma_table_partagee et non ma_table_v2, v3, etc.

La Solution : Le pattern "Drop & Load"

La méthode la plus propre et robuste pour mettre à jour une table globale tout en conservant son nom consiste à procéder en deux étapes explicites : supprimer l'ancienne version, puis charger/promouvoir la nouvelle.

Voici comment implémenter cela proprement en Python (SWAT) :

Étape 1 : Supprimer la table existante

Utilisez l'action dropTable. L'astuce consiste à ignorer les erreurs si la table n'existe pas encore (par exemple lors de la toute première exécution) grâce à un bloc try/except ou un paramètre quiet.

Étape 2 : Charger et Promouvoir la nouvelle donnée

Une fois la place libérée, vous pouvez charger votre fichier et le promouvoir immédiatement.

Exemple de code complet

New BufferRO
# Nom de la table et librairie cible
table_name = 'ventes_mensuelles'
lib_name = 'public'
# 1. Nettoyage : On supprime la table globale existante
# L'option quiet=True évite une erreur si la table n'existe pas
conn.table.dropTable(name=table_name, caslib=lib_name, quiet=True)
# 2. Chargement : On upload et on promeut la nouvelle version
conn.upload_file('nouvelles_ventes.csv',
casout=dict(name=table_name,
caslib=lib_name,
promote=True))
print(f"La table {table_name} a été mise à jour avec succès.")
~
~

Si vous devez rafraîchir des données partagées sur CAS :

  1. N'essayez pas de forcer l'écrasement (replace=True) directement sur une table promue.

  2. Supprimez d'abord explicitement la table avec dropTable.

  3. Rechargez vos données.

Cette approche garantit que vos rapports SAS© Visual Analytics ou vos autres utilisateurs pointent toujours vers la version la plus récente des données, sous le même nom fixe.