Vos données sont partitionnées sur plusieurs nœuds (workers) et threads.
Le Data Step s'exécute en parallèle sur chaque thread.
Chaque thread possède sa propre instance locale de la Hash Table.
Le problème : Si le doublon de la clé "A" se trouve sur le Thread 1 et que l'original est sur le Thread 2, leurs Hash Tables respectives ne communiquent pas. Chaque thread pensera avoir une clé unique. Résultat : des doublons persistent dans la table finale consolidée.
Solution 1 : La méthode native (Recommandée)
La façon la plus efficace de dédoublonner dans Viya™ est d'utiliser l'action CAS dédiée. Elle est optimisée pour le moteur distribué et gère le brassage des données (shuffling) nécessaire pour comparer les enregistrements entre les nœuds.
Contrairement aux idées reçues, la bonne vieille PROC SORT avec l'option NODUPKEY est très performante dans CAS.
Le moteur CAS intercepte la syntaxe de la PROC SORT et la traduit en opérations distribuées optimisées. Elle ne ramène pas les données en local pour les trier ; tout se passe en mémoire sur le cluster.
proc sort data=casuser.ma_table_source out=casuser.ma_table_dedoublonnee nodupkey;
by var_cle1 var_cle2;
run;
Verdict : Les tests montrent que cette méthode est presque aussi rapide que l'action deduplicate. C'est souvent le meilleur choix pour migrer du code existant sans réécriture complexe.
Si vous tenez absolument à utiliser un Data Step, vous devez abandonner la logique Hash Table pour revenir à la logique séquentielle BY + FIRST..
Pourquoi cela fonctionne-t-il sans tri préalable ?
Dans CAS, l'instruction BY force une réorganisation des données : le contrôleur s'assure que toutes les lignes ayant la même clé BY sont envoyées au même thread (grouping).
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;
Attention : Bien que fonctionnelle, cette méthode implique un mouvement massif de données (network shuffle) pour regrouper les clés, ce qui peut être moins performant que l'action dédiée sur de très gros volumes.
Single-threaded : Forcer l'exécution sur un seul thread (/single=yes) résoudrait le problème des Hash Tables, mais tuerait la performance en annulant tout l'intérêt du traitement parallèle de Viya™.
Die auf WeAreCAS.eu bereitgestellten Codes und Beispiele dienen Lehrzwecken. Es ist zwingend erforderlich, sie nicht blind in Ihre Produktionsumgebungen zu kopieren. Der beste Ansatz besteht darin, die Logik zu verstehen, bevor sie angewendet wird. Wir empfehlen dringend, diese Skripte in einer Testumgebung (Sandbox/Dev) zu testen. WeAreCAS übernimmt keine Verantwortung für mögliche Auswirkungen oder Datenverluste auf Ihren Systemen.
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.