Guide SAS VIYA

SAS Viya & Python: ¿Cómo reemplazar una tabla global (Global Table)?

Simon 30/07/2023 1 Aufrufe

La automatización de los flujos de datos entre Python y SAS© Viya a través de la interfaz SWAT es una práctica común. Sin embargo, un error específico ocurre a menudo cuando se intenta actualizar datos compartidos con todos los usuarios: "Global Table cannot be replaced".

Este artículo explica por qué ocurre este error y cuál es la buena práctica para actualizar sus tablas globales sin cambiar su nombre.

Illustration

A continuación se presenta una propuesta de artículo técnico basado en los intercambios proporcionados, redactado para un blog de desarrolladores o una base de conocimientos interna.


SAS© Viya & Python: ¿Cómo reemplazar una tabla global (Global Table)?

La automatización de los flujos de datos entre Python y SAS© Viya a través de la interfaz SWAT es una práctica común. Sin embargo, un error específico ocurre a menudo cuando se intenta actualizar datos compartidos con todos los usuarios: "Global Table cannot be replaced".

Este artículo explica por qué ocurre este error y cuál es la buena práctica para actualizar sus tablas globales sin cambiar su nombre.

El Problema: El reemplazo imposible

Imagine el siguiente scenario: tiene un script de Python que carga un archivo CSV, lo transforma e intenta subirlo al servidor CAS para que esté accesible para todos (Promocionar a Global Scope).

Su código probablemente se parezca a esto:

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

En la primera ejecución, todo funciona. Pero en la segunda ejecución, el script falla con el mensaje:

ERROR: Global tables cannot be replaced.

¿Por qué?

En la arquitectura CAS, las tablas "Globales" (aquellas que sobreviven al cierre de su sesión y son visibles para todos) están protegidas. Las opciones promote=True y replace=True no se pueden usar simultáneamente para reemplazar una tabla global existente. El sistema rechaza esta operación para evitar conflictos de acceso concurrente o eliminaciones accidentales de datos críticos.

Las falsas buenas ideas

Frente a este bloqueo, a veces uno se siente tentado a:

  1. No reemplazar (replace=False): Esto fallará porque la tabla ya existe.

  2. Cambiar el nombre de la tabla de destino: Esto funciona técnicamente, pero es inmanejable para los informes o los usuarios que esperan encontrar una tabla llamada ma_table_partagee y no ma_table_v2, v3, etc.

La Solución: El patrón "Drop & Load"

El método más limpio y robusto para actualizar una tabla global conservando su nombre es proceder en dos pasos explícitos: eliminar la versión antigua y luego cargar/promocionar la nueva.

A continuación, se explica cómo implementarlo correctamente en Python (SWAT):

Paso 1: Eliminar la tabla existente

Utilice la acción dropTable. El truco consiste en ignorar los errores si la tabla aún no existe (por ejemplo, durante la primera ejecución) mediante un bloque try/except o un parámetro quiet.

Paso 2: Cargar y Promocionar los nuevos datos

Una vez liberado el espacio, puede cargar su archivo y promocionarlo de inmediato.

Ejemplo de código completo

New Buffer RO
# 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 necesita actualizar datos compartidos en CAS:

  1. No intente forzar el reemplazo (replace=True) directamente en una tabla promocionada.

  2. Primero, elimine explícitamente la tabla con dropTable.

  3. Vuelva a cargar sus datos.

Este enfoque garantiza que sus informes de SAS© Visual Analytics u otros usuarios siempre apunten a la versión más reciente de los datos, bajo el mismo nombre fijo.