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™.
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.