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™.
The codes and examples provided on WeAreCAS.eu are for educational purposes. It is imperative not to blindly copy-paste them into your production environments. The best approach is to understand the logic before applying it. We strongly recommend testing these scripts in a test environment (Sandbox/Dev). WeAreCAS accepts no responsibility for any impact or data loss on your systems.
SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. ® indicates USA registration. WeAreCAS is an independent community site and is not affiliated with SAS Institute Inc.
This site uses technical and analytical cookies to improve your experience.
Read more.