Publié le :
ETL CREATION_INTERNE

Créer une vue avec deux tables

Ce code est également disponible en : Deutsch English Español
En attente de validation
L'objectif est de montrer comment l'action `table.view` de l'action set 'table' peut être utilisée pour créer une vue logique à partir de deux tables en mémoire CAS. L'exemple charge un jeu de données 'cars.csv', crée une table de résumé 'cars_summary' via FedSQL, puis combine ces deux tables en une vue nommée 'cars_view'. Des options telles que `replace=True` et l'utilisation de préfixes pour les colonnes jointes (`f1_`, `d1_`) sont également illustrées. Enfin, les informations de la vue sont affichées via `table.tableInfo` et les premières lignes sont extraites avec `table.fetch`, incluant des variables calculées. Les exemples supplémentaires explorent la création de vues basiques, l'application de filtres et de colonnes calculées, l'intégration de données catégorisées, et la gestion des erreurs lors de la création de vues.
Analyse des données

Type : CREATION_INTERNE


Les exemples utilisent des données CSV chargées à partir d'une URL support.sas.com, puis agrégées ou directement utilisées pour la création de tables temporaires en mémoire CAS, ainsi que des données générées via `datalines`.

1 Bloc de code
DATA STEP / table.view Data
Explication :
Cet exemple crée deux petites tables en mémoire CAS à l'aide de DATA steps et de `datalines`. Ensuite, il utilise l'action `table.view` pour créer une vue nommée `simple_view` en joignant `table1` et `table2` sur la colonne `ID`. Les alias `t1` et `t2` sont utilisés pour préfixer les colonnes dans la vue. Enfin, il affiche les informations et les premières lignes de la vue.
Copié !
1/* Exemple 1 : Utilisation Basique */
2/* Crée deux tables CAS simples et une vue qui les joint. */
3 
4/* Assurez-vous d'avoir une session CAS active */
5options cashost="cloud.example.com" casport=5570;
6cas casauto;
7 
8/* Création de la première table (fictif) */
9DATA casuser.table1(promote=yes);
10 INPUT ID $ Name $;
11 DATALINES;
12 101 Alice
13 102 Bob
14 103 Charlie
15 ;
16RUN;
17 
18/* Création de la deuxième table (fictif) */
19DATA casuser.table2(promote=yes);
20 INPUT ID $ Score;
21 DATALINES;
22 101 85
23 102 92
24 104 78
25 ;
26RUN;
27 
28/* Création de la vue en joignant les deux tables */
29PROC CAS;
30 TABLE.view /
31 name="simple_view",
32 replace=True,
33 tables={
34 {name="table1", as="t1"},
35 {name="table2", as="t2", keys="t1_ID=t2_ID"}
36 };
37RUN;
38 
39/* Affichage des informations de la vue */
40PROC CAS;
41 TABLE.tableInfo / TABLE="simple_view";
42RUN;
43 
44/* Affichage des premières lignes de la vue */
45PROC CAS;
46 TABLE.fetch /
47 TABLE="simple_view",
48 to=5;
49RUN;
50 
2 Bloc de code
DATA STEP / table.view Data
Explication :
Cet exemple étend le cas basique en ajoutant un filtrage (`where='t2_Score > 80'`) pour inclure uniquement les lignes où le score est supérieur à 80. Il introduit également une colonne calculée `FullInfo` en utilisant `computedVarsProgram` qui concatène les informations du nom et du score. La commande `table.fetch` sélectionne ensuite des variables spécifiques, y compris la variable calculée.
Copié !
1/* Exemple 2 : Options Courantes (Filtrage et sélection de colonnes) */
2/* Utilise les tables de l'exemple 1 et crée une vue filtrée avec des colonnes spécifiques. */
3 
4/* Assurez-vous d'avoir une session CAS active */
5options cashost="cloud.example.com" casport=5570;
6cas casauto;
7 
8/* Création de la première table (fictif) */
9DATA casuser.table1(promote=yes);
10 INPUT ID $ Name $;
11 DATALINES;
12 101 Alice
13 102 Bob
14 103 Charlie
15 104 David
16 ;
17RUN;
18 
19/* Création de la deuxième table (fictif) */
20DATA casuser.table2(promote=yes);
21 INPUT ID $ Score;
22 DATALINES;
23 101 85
24 102 92
25 103 78
26 104 65
27 ;
28RUN;
29 
30/* Création de la vue avec un filtre et sélection de colonnes */
31PROC CAS;
32 TABLE.view /
33 name="filtered_view",
34 replace=True,
35 tables={
36 {name="table1", as="t1"},
37 {name="table2", as="t2", keys="t1_ID=t2_ID"}
38 },
39 where="t2_Score > 80",
40 computedVarsProgram="FullInfo = t1_Name || ' (Score: ' || strip(put(t2_Score, 3.)) || ')'",
41 computedVars={"FullInfo"}
42 ;
43RUN;
44 
45/* Affichage des informations de la vue */
46PROC CAS;
47 TABLE.tableInfo / TABLE="filtered_view";
48RUN;
49 
50/* Affichage des premières lignes de la vue avec les colonnes sélectionnées */
51PROC CAS;
52 TABLE.fetch /
53 TABLE="filtered_view",
54 fetchVars={"t1_ID", "t1_Name", "t2_Score", "FullInfo"},
55 to=5;
56RUN;
3 Bloc de code
PROC HTTP / PROC CAS / FedSQL
Explication :
Cet exemple charge le jeu de données 'cars.csv'. Il crée ensuite une table agrégée `cars_summary_with_category` en utilisant `fedSql.execDirect`. Cette table agrège les données par `drivetrain` et par une `Weight_Category` dérivée dynamiquement via une instruction `CASE` SQL. La vue `advanced_cars_view` est ensuite créée en joignant `cars_raw` et cette nouvelle table agrégée sur la colonne `Drivetrain`. Une colonne calculée `FullCarInfo` est ajoutée pour combiner plusieurs informations textuelles.
Copié !
1/* Exemple 3 : Cas Avancé (Table dérivée avec catégorie de poids et jointure) */
2/* Charge le jeu de données Cars, crée une table agrégée avec une catégorie de poids, puis une vue. */
3 
4/* Assurez-vous d'avoir une session CAS active */
5options cashost="cloud.example.com" casport=5570;
6cas casauto;
7 
8/* Téléchargement et chargement du fichier CSV cars.csv */
9%let DATA='http://support.sas.com/documentation/onlinedoc/viya/exampledatasets/cars.csv';
10filename t temp;
11PROC HTTP method="get" url=&DATA. out=t;
12RUN;
13%let temppath = %sysfunc(quote(%sysfunc(pathname(t))));
14 
15PROC CAS;
16 upload path=&temppath.
17 importoptions={
18 fileType="csv",
19 getNames=True
20 },
21 casout={
22 name="cars_raw",
23 replace=True
24 };
25RUN;
26 
27/* Création d'une table agrégée avec une catégorie de poids dérivée */
28PROC CAS;
29 fedSql.execDirect /
30 query="create table cars_summary_with_category{options replace=True} as
31 select
32 drivetrain,
33 (case
34 when weight <= 1500 then 'Light'
35 when weight > 1500 and weight <= 3000 then 'Medium'
36 else 'Heavy'
37 end) as Weight_Category,
38 avg(mpg_city) as Avg_MPG_City
39 from cars_raw
40 group by drivetrain, Weight_Category;";
41RUN;
42 
43/* Création de la vue en joignant cars_raw et cars_summary_with_category */
44PROC CAS;
45 TABLE.view /
46 name="advanced_cars_view",
47 replace=True,
48 tables={
49 {name="cars_raw", as="r1"},
50 {name="cars_summary_with_category", as="s1", keys="r1_Drivetrain=s1_Drivetrain"}
51 },
52 computedVarsProgram="FullCarInfo = r1_Make || ' - ' || r1_Model || ' (' || s1_Weight_Category || ')';"
53 ;
54RUN;
55 
56/* Affichage des informations de la vue */
57PROC CAS;
58 TABLE.tableInfo / TABLE="advanced_cars_view";
59RUN;
60 
61/* Affichage des premières lignes de la vue */
62PROC CAS;
63 TABLE.fetch /
64 TABLE="advanced_cars_view",
65 fetchVars={"FullCarInfo", "r1_Drivetrain", "r1_Weight", "s1_Weight_Category", "s1_Avg_MPG_City"},
66 to=5;
67RUN;
68 
4 Bloc de code
DATA STEP / table.view Data
Explication :
Cet exemple crée une `existing_table` simple. Ensuite, il tente délibérément de créer une vue (`error_view`) en joignant `existing_table` avec une `non_existent_table`. Étant donné que `non_existent_table` n'existe pas, l'action `table.view` échouera, démontrant ainsi un scénario d'erreur. Les erreurs seront enregistrées dans le log SAS/CAS. La tentative subséquente d'accéder à `error_view` avec `table.tableInfo` entraînera également une erreur, confirmant que la vue n'a pas été créée. La table `existing_table` est ensuite supprimée.
Copié !
1/* Exemple 4 : Intégration Viya (Gestion d'erreur lors de la création de vue) */
2/* Tente de créer une vue avec une table inexistante et capture l'erreur. */
3 
4/* Assurez-vous d'avoir une session CAS active */
5options cashost="cloud.example.com" casport=5570;
6cas casauto;
7 
8/* Création d'une table valide pour la démonstration */
9DATA casuser.existing_table(promote=yes);
10 INPUT ID $ Value;
11 DATALINES;
12 A 10
13 B 20
14 C 30
15 ;
16RUN;
17 
18/* Tentative de création d'une vue avec une table inexistante */
19/* La vue ne sera pas créée, et une erreur sera loguée. */
20PROC CAS;
21 /* La commande 'table.view' générera une erreur si 'non_existent_table' n'existe pas. */
22 /* Dans un programme CASL plus robuste, un bloc try/catch serait utilisé. */
23 /* Pour cet exemple, l'erreur sera visible dans le log SAS/CAS. */
24 TABLE.view /
25 name="error_view",
26 replace=True,
27 tables={
28 {name="existing_table", as="e1"},
29 {name="non_existent_table", as="n1", keys="e1_ID=n1_ID"} /* Cette table n'existe pas */
30 };
31RUN; QUIT; /* La vue ne sera pas créée. */
32 
33/* Tenter d'afficher des informations sur la vue inexistante (cela générera aussi une erreur) */
34PROC CAS;
35 TABLE.tableInfo / TABLE="error_view";
36RUN; QUIT;
37 
38/* Nettoyage: suppression de la table existante */
39PROC CAS;
40 TABLE.dropTable / caslib="casuser" name="existing_table";
41RUN;
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.
Informations de Copyright : Copyright © SAS Institute Inc. All Rights Reserved


Banner
Le Conseil de l'Expert
Expert
Michael
Responsable de l'infrastructure Viya.
« "Multiplier les tables physiques en mémoire pour chaque étape de transformation est une pratique qui mène rapidement à l'encombrement des caslibs et à des erreurs de versioning. La vue CAS est la réponse à ce défi.

En utilisant l'option replace=True et en gérant proprement les erreurs de tables inexistantes, vous construisez des applications plus robustes. Les vues permettent de masquer la complexité des jointures aux outils de visualisation comme SAS Visual Analytics. L'utilisateur ne voit qu'une seule table propre, tandis que le moteur CAS gère en coulisse la complexité des relations et des agrégations en temps réel, garantissant ainsi une expérience fluide et sécurisée »