Data Step

CAS-Tabellen deduplizieren: Warum Ihre Hash-Tabellen fehlschlagen und wie Sie es beheben können

Simon 5 Aufrufe

Wenn Sie ein SAS© 9-Experte sind, verwenden Sie wahrscheinlich die Hash-Tabellen, um große Datenmengen effizient zu deduplizieren, ohne sie sortieren zu müssen (PROC SORT). Wenn Sie diesen Code jedoch zu SAS© Viya (CAS) migrieren, könnten Sie eine böse Überraschung erleben: Ihre Ausgabetabelle enthält immer noch Duplikate.

Warum versagt diese bewährte Technik in der Cloud, und welche leistungsstarken Alternativen gibt es?

Die Falle: Hash-Tabellen und verteilte Verarbeitung

In einer klassischen SAS© 9-Umgebung (SMP) wird der Data Step sequenziell auf einem einzigen Prozessor ausgeführt. Die Hash-Tabelle speichert die einzigartigen Schlüssel, die seit Beginn der Datei gesehen wurden.

In CAS (MPP - Massively Parallel Processing) ist die Ausführung grundlegend anders:

  1. Ihre Daten sind auf mehrere Knoten (Worker) und Threads partitioniert.

  2. Der Data Step wird parallel auf jedem Thread ausgeführt.

  3. Jeder Thread besitzt seine eigene lokale Instanz der Hash-Tabelle.

Das Problem: Befindet sich das Duplikat des Schlüssels "A" auf dem Thread 1 und das Original auf dem Thread 2, kommunizieren ihre jeweiligen Hash-Tabellen nicht. Jeder Thread wird denken, einen eindeutigen Schlüssel zu haben. Ergebnis: Duplikate bleiben in der finalen konsolidierten Tabelle bestehen.


Lösung 1: Die native Methode (Empfohlen)

Der effizienteste Weg zur Deduplizierung in Viya ist die Verwendung der dedizierten CAS-Aktion. Sie ist für die verteilte Engine optimiert und verwaltet das notwendige Daten-Shuffling, um Datensätze zwischen den Knoten zu vergleichen.

Verwenden Sie die Aktion deduplication.deduplicate über PROC CAS:

1PROC CAS;
2 deduplication.deduplicate /
3 TABLE={caslib="casuser", name="ma_table_source", groupBy={"var_cle1", "var_cle2"}}
4 noDuplicateKeys=true
5 casOut={name="ma_table_dedoublonnee", caslib="casuser", replace=true};
6QUIT;
Vorteil: Maximale Leistung.

Hinweis: Die Option groupBy definiert die Deduplizierungsschlüssel.

Lösung 2: Die Überraschung PROC SORT

Entgegen der landläufigen Meinung ist die gute alte PROC SORT mit der Option NODUPKEY in CAS sehr leistungsfähig.

Die CAS-Engine fängt die Syntax von PROC SORT ab und übersetzt sie in optimierte verteilte Operationen. Sie holt die Daten nicht lokal zum Sortieren; alles geschieht im Speicher des Clusters.

1 
2PROC SORT
3DATA=casuser.ma_table_source out=casuser.ma_table_dedoublonnee nodupkey;
4 
5BY var_cle1 var_cle2;
6 
7RUN;
8 
Fazit: Tests zeigen, dass diese Methode fast so schnell ist wie die Deduplicate-Aktion. Dies ist oft die beste Wahl, um bestehenden Code ohne komplexe Umschreibungen zu migrieren.

Lösung 3: Der Data Step mit BY group

Wenn Sie unbedingt einen Data Step verwenden möchten, müssen Sie die Hash-Tabellen-Logik aufgeben und zur sequenziellen Logik BY + FIRST. zurückkehren.

Warum funktioniert das ohne vorherige Sortierung? In CAS erzwingt die BY-Anweisung eine Neuorganisation der Daten: Der Controller stellt sicher, dass alle Zeilen mit demselben BY-Schlüssel an denselben Thread gesendet werden (Gruppierung).

1DATA casuser.ma_table_dedoublonnee;
2 SET casuser.ma_table_source;
3 BY var_cle1 var_cle2;
4 IF first.var_cle2; /* Garde la première occurrence */
5RUN;
Achtung: Obwohl funktionsfähig, beinhaltet diese Methode eine massive Datenverschiebung (Network Shuffle), um die Schlüssel zu gruppieren, was bei sehr großen Mengen weniger performant sein kann als die dedizierte Aktion.

Single-threaded: Das Erzwingen der Ausführung auf einem einzigen Thread (/single=yes) würde das Problem der Hash-Tabellen lösen, aber die Leistung beeinträchtigen, indem der gesamte Vorteil der parallelen Verarbeitung von Viya zunichtegemacht wird.

Zusammenfassung

MethodeLeistungKomplexitätUrteil
Hash-TabellenHochMittelVermeiden zur Deduplizierung (Risiko logischer Fehler in verteilten Systemen).
CAS-Aktion (deduplicate)⭐⭐⭐MittelTop für native CASL-Skripte.
PROC SORT (nodupkey)⭐⭐½NiedrigIdeal für Kompatibilität und Einfachheit.
Data Step (By Group)⭐⭐Niedrig⚠️ Funktioniert, aber Vorsicht vor Netzwerkkosten.