Publié le :
ETL CREATION_INTERNE

Ajouter une table CAS

Ce code est également disponible en : English Español Deutsch Français
En attente de validation
L'action `table.append` est utilisée pour combiner deux tables CAS en ajoutant le contenu de la table source à la table cible. Elle est particulièrement utile pour incrémenter des ensembles de données sans avoir à recharger l'intégralité de la table cible. Les tables source et cible doivent avoir des structures compatibles pour que l'opération réussisse, bien que CAS puisse gérer certaines différences de types ou de longueurs de colonnes. Si les tables ne sont pas entièrement compatibles, des avertissements ou des erreurs peuvent survenir. L'action s'exécute dans le contexte d'une session CAS et peut être invoquée via une PROC CAS en SAS©, ou directement via les API CASL, Lua, Python ou R.
Analyse des données

Type : CREATION_INTERNE


Les exemples utilisent des données générées (DATA step avec affectation directe) pour créer des tables CAS temporaires.

1 Bloc de code
DATA STEP / PROC CAS Data
Explication :
Cet exemple montre l'utilisation la plus simple de `table.append`. Deux tables, `t1` (source) et `t2` (cible), sont créées avec des structures identiques. L'action `table.append` est ensuite appelée pour ajouter toutes les lignes de `t1` à la fin de `t2`. Enfin, `proc print` est utilisé pour vérifier le contenu de la table `t2` après l'opération d'ajout.
Copié !
1/* Préparation de l'environnement CAS */
2options cashost="cloud.example.com" casport=5570;
3cas casauto;
4LIBNAME mycas cas caslib="CASUSER(your-username)";
5 
6/* Création de la table cible (t2) */
7DATA mycas.t2;
8 LENGTH id 8 nom $10 ville $10;
9 id = 1;
10 nom = 'Alice';
11 ville = 'Paris';
12 OUTPUT;
13 id = 2;
14 nom = 'Bob';
15 ville = 'Lyon';
16 OUTPUT;
17RUN;
18 
19/* Création de la table source (t1) */
20DATA mycas.t1;
21 LENGTH id 8 nom $10 ville $10;
22 id = 3;
23 nom = 'Charlie';
24 ville = 'Marseille';
25 OUTPUT;
26RUN;
27 
28/* Ajout de la table t1 à la table t2 */
29PROC CAS;
30 TABLE.append /
31 SOURCE={caslib='CASUSER(your-username)',name='t1'}
32 target={caslib='CASUSER(your-username)',name='t2'};
33RUN;
34 
35/* Affichage de la table t2 mise à jour */
36PROC PRINT DATA=mycas.t2; RUN;
2 Bloc de code
DATA STEP / PROC CAS Data
Explication :
Cet exemple utilise l'action `table.append` avec des tables de structures légèrement différentes. La table source `nouveaux_clients` contient une colonne `pays` qui n'existe pas dans la table cible `clients`. CAS gérera cette incompatibilité en ignorant la colonne `pays` lors de l'ajout. L'option `promote=TRUE` sur la table cible assure que la table mise à jour est visible pour tous les utilisateurs ayant les permissions appropriées dans la session CAS. L'option `noAutoPromote=FALSE` est incluse pour s'assurer que si 'promote' est utilisé, il prévaut sur la promotion automatique, si elle est désactivée par défaut.
Copié !
1/* Préparation de l'environnement CAS */
2options cashost="cloud.example.com" casport=5570;
3cas casauto;
4LIBNAME mycas cas caslib="CASUSER(your-username)";
5 
6/* Création de la table cible (clients) */
7DATA mycas.clients;
8 LENGTH id 8 nom $10 age 8;
9 id = 1;
10 nom = 'Alice';
11 age = 30;
12 OUTPUT;
13RUN;
14 
15/* Création de la table source (nouveaux_clients) avec une colonne supplémentaire */
16DATA mycas.nouveaux_clients;
17 LENGTH id 8 nom $10 age 8 pays $10;
18 id = 3;
19 nom = 'Charlie';
20 age = 25;
21 pays = 'France';
22 OUTPUT;
23RUN;
24 
25/* Ajout avec l'option 'casout' et 'promote' pour rendre la table visible et 'noAutoPromote=FALSE' */
26PROC CAS;
27 TABLE.append /
28 SOURCE={caslib='CASUSER(your-username)',name='nouveaux_clients'}
29 target={caslib='CASUSER(your-username)',name='clients', promote=TRUE, noAutoPromote=FALSE};
30RUN;
31 
32/* Affichage de la table clients mise à jour */
33PROC PRINT DATA=mycas.clients; RUN;
3 Bloc de code
DATA STEP / PROC CAS Data
Explication :
Cet exemple avancé démontre comment renommer des colonnes de la table source à la volée avant l'opération d'ajout. La table `commandes_recentes` a des noms de colonnes différents de `commandes_historiques`. L'option `vars` dans le paramètre `source` est utilisée pour spécifier le mappage des colonnes (`rename='nouveau_nom'`). Cela garantit que les données de la source sont correctement alignées avec la structure de la cible.
Copié !
1/* Préparation de l'environnement CAS */
2options cashost="cloud.example.com" casport=5570;
3cas casauto;
4LIBNAME mycas cas caslib="CASUSER(your-username)";
5 
6/* Création de la table cible (commandes_historiques) */
7DATA mycas.commandes_historiques;
8 LENGTH id_commande 8 article $15 quantite 8 date_achat $10;
9 id_commande = 101;
10 article = 'Livre A';
11 quantite = 2;
12 date_achat = '2023-01-15';
13 OUTPUT;
14RUN;
15 
16/* Création d'une table source (commandes_recentes) avec des colonnes à renommer/filtrer */
17DATA mycas.commandes_recentes;
18 LENGTH order_id 8 product_name $15 qty 8 purchase_date $10;
19 order_id = 102;
20 product_name = 'Stylo B';
21 qty = 5;
22 purchase_date = '2023-02-20';
23 OUTPUT;
24 order_id = 103;
25 product_name = 'Cahier C';
26 qty = 1;
27 purchase_date = '2023-03-01';
28 OUTPUT;
29RUN;
30 
31/* Ajout après renommage des colonnes dans la source pour correspondre à la cible */
32PROC CAS;
33 TABLE.append /
34 SOURCE={caslib='CASUSER(your-username)', name='commandes_recentes',
35 vars={{name='order_id', rename='id_commande'},
36 {name='product_name', rename='article'},
37 {name='qty', rename='quantite'},
38 {name='purchase_date', rename='date_achat'}}
39 }
40 target={caslib='CASUSER(your-username)', name='commandes_historiques'};
41RUN;
42 
43/* Affichage de la table commandes_historiques mise à jour */
44PROC PRINT DATA=mycas.commandes_historiques; RUN;
4 Bloc de code
DATA STEP / PROC CAS Data
Explication :
Cet exemple explore la gestion des types de données incompatibles lors de l'ajout. Initialement, la table source `nouveaux_produits` a la colonne `prix` comme chaîne de caractères, tandis que la table cible `produits` a `prix` comme numérique. Une tentative directe d'ajout avec `addCols=TRUE` (qui par défaut gère les colonnes manquantes) pourrait échouer ou entraîner une conversion implicite avec perte de données si les types sont trop différents. La solution montrée est de créer une étape `DATA` intermédiaire (`nouveaux_produits_clean`) pour explicitement convertir la colonne `prix` de la source en numérique avant de procéder à l'ajout. Cela garantit la compatibilité des types et la réussite de l'opération.
Copié !
1/* Préparation de l'environnement CAS */
2options cashost="cloud.example.com" casport=5570;
3cas casauto;
4LIBNAME mycas cas caslib="CASUSER(your-username)";
5 
6/* Création de la table cible (produits) */
7DATA mycas.produits;
8 LENGTH ref 8 nom_produit $15 prix 8;
9 ref = 1;
10 nom_produit = 'Pommes';
11 prix = 1.50;
12 OUTPUT;
13RUN;
14 
15/* Création d'une table source (nouveaux_produits) avec type de données incompatible pour 'prix' */
16DATA mycas.nouveaux_produits;
17 LENGTH ref 8 nom_produit $15 prix $10;
18 ref = 2;
19 nom_produit = 'Poires';
20 prix = '2.25 EUR'; /* Prix comme chaîne de caractères */
21 OUTPUT;
22 ref = 3;
23 nom_produit = 'Bananes';
24 prix = '1.80'; /* Prix comme chaîne de caractères */
25 OUTPUT;
26RUN;
27 
28/* Tentative d'ajout avec l'option 'addCols=FALSE' pour ignorer les colonnes incompatibles, ou 'addCols=TRUE' pour tenter d'ajouter les colonnes */
29/* Dans cet exemple, nous allons d'abord illustrer un échec potentiel en omettant 'addCols' ou en l'utilisant avec 'promote=FALSE' sur source, puis une solution. */
30/* Tentative échouée si les types sont trop différents et sans gestion spécifique */
31PROC CAS;
32 TABLE.append /
33 SOURCE={caslib='CASUSER(your-username)',name='nouveaux_produits'}
34 target={caslib='CASUSER(your-username)',name='produits'}
35 addCols=TRUE; /* Tente d'ajouter de nouvelles colonnes si elles n'existent pas */
36 /* Si les colonnes existent mais ont des types incompatibles, cela peut échouer ou entraîner une conversion de type */
37RUN;
38 
39/* Pour gérer l'incompatibilité de type sur 'prix', on peut la renommer ou la supprimer/convertir dans la source */
40/* Ici, nous allons convertir 'prix' en numérique avant l'ajout */
41DATA nouveaux_produits_clean;
42 SET mycas.nouveaux_produits;
43 prix_num = INPUT(prix, BEST.); /* Convertit la chaîne en numérique */
44 drop prix;
45 rename prix_num=prix;
46RUN;
47 
48/* Ajout avec la table source nettoyée */
49PROC CAS;
50 TABLE.append /
51 SOURCE={caslib='CASUSER(your-username)',name='nouveaux_produits_clean'}
52 target={caslib='CASUSER(your-username)',name='produits'};
53RUN;
54 
55/* Affichage de la table produits mise à jour */
56PROC PRINT DATA=mycas.produits; RUN;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Banner
Le Conseil de l'Expert
Expert
Michael
Responsable de l'infrastructure Viya.
« L'action table.append est bien plus qu'une simple concaténation de lignes ; c'est un moteur de fusion intelligent capable de réconcilier des structures de données hétérogènes directement en mémoire CAS.

Pour vos processus de production, utilisez l'option addCols=TRUE avec parcimonie. Si elle est pratique pour ajouter de nouvelles métadonnées à une table historique, elle peut aussi introduire du "bruit" dans vos données si les sources ne sont pas parfaitement maîtrisées. »