Guide SAS VIYA

SAS Viya & Python: Wie ersetzt man eine globale Tabelle (Global Table)?

Simon 30/07/2023 2 vistas

Die Automatisierung von Datenflüssen zwischen Python und SAS© Viya über die SWAT-Schnittstelle ist eine gängige Praxis. Ein spezifischer Fehler tritt jedoch häufig auf, wenn versucht wird, Daten zu aktualisieren, die mit allen Benutzern geteilt werden: "Global Table cannot be replaced".

Dieser Artikel erklärt, warum dieser Fehler auftritt und was die bewährte Methode ist, um Ihre globalen Tabellen zu aktualisieren, ohne ihren Namen zu ändern.

Illustration

Hier ist ein Vorschlag für einen technischen Artikel, der auf den bereitgestellten Austauschen basiert und für einen Entwicklerblog oder eine interne Wissensdatenbank verfasst wurde.


SAS© Viya & Python: Wie ersetzt man eine globale Tabelle (Global Table)?

Die Automatisierung von Datenflüssen zwischen Python und SAS© Viya über die SWAT-Schnittstelle ist eine gängige Praxis. Ein spezifischer Fehler tritt jedoch häufig auf, wenn versucht wird, Daten zu aktualisieren, die mit allen Benutzern geteilt werden: "Global Table cannot be replaced".

Dieser Artikel erklärt, warum dieser Fehler auftritt und was die bewährte Methode ist, um Ihre globalen Tabellen zu aktualisieren, ohne ihren Namen zu ändern.

Das Problem: Das unmögliche Überschreiben

Stellen Sie sich folgendes Szenario vor: Sie haben ein Python-Skript, das eine CSV-Datei lädt, umwandelt und versucht, sie auf den CAS-Server hochzuladen, um sie für alle zugänglich zu machen (Promoten in den Global Scope).

Ihr Code sieht wahrscheinlich so aus:

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

Bei der ersten Ausführung funktioniert alles. Aber bei der zweiten Ausführung schlägt das Skript mit der Meldung fehl:

ERROR: Global tables cannot be replaced.

Warum?

In der CAS-Architektur sind "globale" Tabellen (diejenigen, die das Schließen Ihrer Sitzung überleben und für alle sichtbar sind) geschützt. Die Optionen promote=True und replace=True können nicht gleichzeitig verwendet werden, um eine vorhandene globale Tabelle zu überschreiben. Das System verweigert diesen Vorgang, um konkurrierende Zugriffskonflikte oder versehentliches Löschen kritischer Daten zu vermeiden.

Die falschen guten Ideen

Angesichts dieser Blockade ist man manchmal versucht:

  1. Nicht zu ersetzen (replace=False): Dies schlägt fehl, da die Tabelle bereits existiert.

  2. Den Namen der Zieltabelle zu ändern: Das funktioniert technisch, ist aber für Berichte oder Benutzer, die eine Tabelle mit dem Namen ma_table_partagee und nicht ma_table_v2, v3 usw. erwarten, nicht handhabbar.

Die Lösung: Das „Drop & Load“-Muster

Die sauberste und robusteste Methode zur Aktualisierung einer globalen Tabelle unter Beibehaltung ihres Namens besteht darin, in zwei expliziten Schritten vorzugehen: die alte Version löschen und dann die neue laden/promoten.

So implementieren Sie dies sauber in Python (SWAT):

Schritt 1: Die vorhandene Tabelle löschen

Verwenden Sie die Aktion dropTable. Der Trick besteht darin, Fehler zu ignorieren, wenn die Tabelle noch nicht existiert (z. B. bei der allerersten Ausführung), indem man einen try/except-Block oder einen quiet-Parameter verwendet.

Schritt 2: Die neuen Daten laden und promoten

Sobald der Platz frei ist, können Sie Ihre Datei laden und sofort promoten.

Vollständiges Code-Beispiel

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.")
~
~

Wenn Sie geteilte Daten auf CAS aktualisieren müssen:

  1. Versuchen Sie nicht, das Überschreiben (replace=True) direkt auf einer promoteten Tabelle zu erzwingen.

  2. Löschen Sie zuerst explizit die Tabelle mit dropTable.

  3. Laden Sie Ihre Daten neu.

Dieser Ansatz stellt sicher, dass Ihre SAS© Visual Analytics-Berichte oder andere Benutzer immer auf die aktuellste Version der Daten unter demselben festen Namen verweisen.