/****************************************************************************** * Programme : Scalable Data Pipelines: Appending CAS Tables without Full Reloads via PROC CAS * Reference : SANSTI6DF6 * Source : https://www.wearecas.eu/en/sampleCode/SANSTI6DF6 ******************************************************************************/ /* --- BLOC 1 --- */ /* Préparation de l'environnement CAS */ options cashost="cloud.example.com" casport=5570; cas casauto; libname mycas cas caslib="CASUSER(your-username)"; /* Création de la table cible (t2) */ data mycas.t2; length id 8 nom $10 ville $10; id = 1; nom = 'Alice'; ville = 'Paris'; output; id = 2; nom = 'Bob'; ville = 'Lyon'; output; run; /* Création de la table source (t1) */ data mycas.t1; length id 8 nom $10 ville $10; id = 3; nom = 'Charlie'; ville = 'Marseille'; output; run; /* Ajout de la table t1 à la table t2 */ proc cas; table.append / source={caslib='CASUSER(your-username)',name='t1'} target={caslib='CASUSER(your-username)',name='t2'}; run; /* Affichage de la table t2 mise à jour */ proc print data=mycas.t2; run; /* --- BLOC 2 --- */ /* Préparation de l'environnement CAS */ options cashost="cloud.example.com" casport=5570; cas casauto; libname mycas cas caslib="CASUSER(your-username)"; /* Création de la table cible (clients) */ data mycas.clients; length id 8 nom $10 age 8; id = 1; nom = 'Alice'; age = 30; output; run; /* Création de la table source (nouveaux_clients) avec une colonne supplémentaire */ data mycas.nouveaux_clients; length id 8 nom $10 age 8 pays $10; id = 3; nom = 'Charlie'; age = 25; pays = 'France'; output; run; /* Ajout avec l'option 'casout' et 'promote' pour rendre la table visible et 'noAutoPromote=FALSE' */ proc cas; table.append / source={caslib='CASUSER(your-username)',name='nouveaux_clients'} target={caslib='CASUSER(your-username)',name='clients', promote=TRUE, noAutoPromote=FALSE}; run; /* Affichage de la table clients mise à jour */ proc print data=mycas.clients; run; /* --- BLOC 3 --- */ /* Préparation de l'environnement CAS */ options cashost="cloud.example.com" casport=5570; cas casauto; libname mycas cas caslib="CASUSER(your-username)"; /* Création de la table cible (commandes_historiques) */ data mycas.commandes_historiques; length id_commande 8 article $15 quantite 8 date_achat $10; id_commande = 101; article = 'Livre A'; quantite = 2; date_achat = '2023-01-15'; output; run; /* Création d'une table source (commandes_recentes) avec des colonnes à renommer/filtrer */ data mycas.commandes_recentes; length order_id 8 product_name $15 qty 8 purchase_date $10; order_id = 102; product_name = 'Stylo B'; qty = 5; purchase_date = '2023-02-20'; output; order_id = 103; product_name = 'Cahier C'; qty = 1; purchase_date = '2023-03-01'; output; run; /* Ajout après renommage des colonnes dans la source pour correspondre à la cible */ proc cas; table.append / source={caslib='CASUSER(your-username)', name='commandes_recentes', vars={{name='order_id', rename='id_commande'}, {name='product_name', rename='article'}, {name='qty', rename='quantite'}, {name='purchase_date', rename='date_achat'}} } target={caslib='CASUSER(your-username)', name='commandes_historiques'}; run; /* Affichage de la table commandes_historiques mise à jour */ proc print data=mycas.commandes_historiques; run; /* --- BLOC 4 --- */ /* Préparation de l'environnement CAS */ options cashost="cloud.example.com" casport=5570; cas casauto; libname mycas cas caslib="CASUSER(your-username)"; /* Création de la table cible (produits) */ data mycas.produits; length ref 8 nom_produit $15 prix 8; ref = 1; nom_produit = 'Pommes'; prix = 1.50; output; run; /* Création d'une table source (nouveaux_produits) avec type de données incompatible pour 'prix' */ data mycas.nouveaux_produits; length ref 8 nom_produit $15 prix $10; ref = 2; nom_produit = 'Poires'; prix = '2.25 EUR'; /* Prix comme chaîne de caractères */ output; ref = 3; nom_produit = 'Bananes'; prix = '1.80'; /* Prix comme chaîne de caractères */ output; run; /* Tentative d'ajout avec l'option 'addCols=FALSE' pour ignorer les colonnes incompatibles, ou 'addCols=TRUE' pour tenter d'ajouter les colonnes */ /* 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. */ /* Tentative échouée si les types sont trop différents et sans gestion spécifique */ proc cas; table.append / source={caslib='CASUSER(your-username)',name='nouveaux_produits'} target={caslib='CASUSER(your-username)',name='produits'} addCols=TRUE; /* Tente d'ajouter de nouvelles colonnes si elles n'existent pas */ /* Si les colonnes existent mais ont des types incompatibles, cela peut échouer ou entraîner une conversion de type */ run; /* Pour gérer l'incompatibilité de type sur 'prix', on peut la renommer ou la supprimer/convertir dans la source */ /* Ici, nous allons convertir 'prix' en numérique avant l'ajout */ data nouveaux_produits_clean; set mycas.nouveaux_produits; prix_num = input(prix, BEST.); /* Convertit la chaîne en numérique */ drop prix; rename prix_num=prix; run; /* Ajout avec la table source nettoyée */ proc cas; table.append / source={caslib='CASUSER(your-username)',name='nouveaux_produits_clean'} target={caslib='CASUSER(your-username)',name='produits'}; run; /* Affichage de la table produits mise à jour */ proc print data=mycas.produits; run;