Ihre Daten sind auf mehrere Knoten (Worker) und Threads partitioniert.
Der Data Step wird parallel auf jedem Thread ausgeführt.
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.
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.
proc sort data=casuser.ma_table_source out=casuser.ma_table_dedoublonnee nodupkey;
by var_cle1 var_cle2;
run;
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.
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).
data casuser.ma_table_dedoublonnee;
set casuser.ma_table_source;
by var_cle1 var_cle2;
if first.var_cle2; /* Garde la première occurrence */
run;
1
DATA 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 */
5
RUN;
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
Methode
Leistung
Komplexität
Urteil
Hash-Tabellen
Hoch
Mittel
❌ Vermeiden zur Deduplizierung (Risiko logischer Fehler in verteilten Systemen).
⚠️ Funktioniert, aber Vorsicht vor Netzwerkkosten.
Aviso importante
Los códigos y ejemplos proporcionados en WeAreCAS.eu son con fines educativos. Es imperativo no copiarlos y pegarlos ciegamente en sus entornos de producción. El mejor enfoque es comprender la lógica antes de aplicarla. Recomendamos encarecidamente probar estos scripts en un entorno de prueba (Sandbox/Dev). WeAreCAS no acepta ninguna responsabilidad por cualquier impacto o pérdida de datos en sus sistemas.
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.