L'erreur 'The call to Cloud Analytic Services failed' est généralement causée par une procédure ou une étape DATA qui tente de créer plusieurs tables de sortie en utilisant le même libref CAS pour l'entrée et la sortie. Le moteur CAS LIBNAME ne peut pas traiter plusieurs actions de sortie simultanément sur un seul libref. Cela est particulièrement observable lorsque l'option WRITETRANSFERSIZE est définie sur une petite valeur, exacerbant la contention. Les solutions proposées incluent l'utilisation d'étapes DATA ou PROC distinctes pour chaque table de sortie, ou l'utilisation d'un moteur de données différent pour la création des tables intermédiaires ou finales.
Analyse des données
Type : CREATION_INTERNE
Les exemples utilisent des données générées (SASHELP.CARS) ou des datalines pour assurer l'autonomie du code.
1 Bloc de code
DATA STEP Data
Explication : Cet exemple démontre le scénario exact qui cause l'erreur décrite dans la documentation. Un seul DATA step tente d'écrire simultanément deux tables ('one' et 'two') dans le même libref CAS ('mycas'). Le moteur CAS LIBNAME, surtout avec un 'writetransfersize' artificiellement petit, ne peut pas gérer plusieurs flux de sortie concurrents de cette manière, ce qui conduit à l'échec de l'appel à Cloud Analytic Services. L'option `writetransfersize=1k` est utilisée pour rendre l'erreur plus probable dans un environnement de test.
Copié !
/* Établit une connexion CAS avec une petite taille de transfert pour provoquer l'erreur */
libname mycas cas s_port=10000 s_host='localhost' caslib='casuser' s_caslib='casuser' s_nthreads=1 s_timeout=1000 writetransfersize=1k;
/* Crée deux tables de sortie dans CAS en utilisant un seul DATA step */
/* Ceci est le scénario qui génère l'erreur 'The call to Cloud Analytic Services failed' */
data mycas.one mycas.two;
set sashelp.cars;
run;
/* Pour nettoyer après l'erreur (si la session n'est pas bloquée) */
/* proc casutil incaslib='casuser'; droptable 'one'; droptable 'two'; run; */
/* libname mycas clear; */
1
/* Établit une connexion CAS avec une petite taille de transfert pour provoquer l'erreur */
2
LIBNAME mycas cas s_port=10000 s_host='localhost' caslib='casuser' s_caslib='casuser' s_nthreads=1 s_timeout=1000 writetransfersize=1k;
3
4
/* Crée deux tables de sortie dans CAS en utilisant un seul DATA step */
5
/* Ceci est le scénario qui génère l'erreur 'The call to Cloud Analytic Services failed' */
6
DATA mycas.one mycas.two;
7
SET sashelp.cars;
8
RUN;
9
10
/* Pour nettoyer après l'erreur (si la session n'est pas bloquée) */
Explication : Cet exemple illustre la solution la plus simple au problème précédent : diviser la création des tables de sortie en plusieurs DATA steps séquentiels. Chaque DATA step écrit une seule table dans le libref CAS, évitant ainsi le conflit d'accès simultané et permettant au moteur CAS LIBNAME de traiter les requêtes individuellement. Cette approche est recommandée pour sa clarté et sa conformité aux meilleures pratiques.
Copié !
/* Établit une connexion CAS */
libname mycas cas s_port=10000 s_host='localhost' caslib='casuser' s_caslib='casuser';
/* Crée la première table de sortie dans un DATA step distinct */
data mycas.one;
set sashelp.cars;
run;
/* Crée la deuxième table de sortie dans un DATA step distinct */
data mycas.two;
set sashelp.cars;
run;
/* Vérification des tables créées */
proc casutil incaslib='casuser'; list tables; run;
/* Nettoyage */
proc casutil incaslib='casuser'; droptable 'one'; droptable 'two'; run;
libname mycas clear;
1
/* Établit une connexion CAS */
2
LIBNAME mycas cas s_port=10000 s_host='localhost' caslib='casuser' s_caslib='casuser';
3
4
/* Crée la première table de sortie dans un DATA step distinct */
5
DATA mycas.one;
6
SET sashelp.cars;
7
RUN;
8
9
/* Crée la deuxième table de sortie dans un DATA step distinct */
10
DATA mycas.two;
11
SET sashelp.cars;
12
RUN;
13
14
/* Vérification des tables créées */
15
PROC CASUTIL incaslib='casuser'; list tables; RUN;
Explication : Cette solution avancée utilise la procédure PROC COPY pour transférer plusieurs tables d'une bibliothèque SAS temporaire (WORK) vers le libref CAS. PROC COPY gère de manière interne le transfert séquentiel des tables, évitant ainsi le problème de contention observé avec l'écriture directe de plusieurs tables dans un seul DATA step. C'est une méthode efficace pour consolider le transfert de données tout en respectant les contraintes du moteur CAS LIBNAME.
Copié !
/* Établit une connexion CAS */
libname mycas cas s_port=10000 s_host='localhost' caslib='casuser' s_caslib='casuser';
/* Crée des données temporaires dans work */
data work.temp_one;
set sashelp.cars;
where make = 'Audi';
run;
data work.temp_two;
set sashelp.cars;
where make = 'BMW';
run;
/* Utilise PROC COPY pour transférer séquentiellement les tables vers CAS */
/* Cela est géré en interne par SAS pour éviter les conflits */
proc copy in=work out=mycas;
select temp_one temp_two;
run;
/* Vérification des tables créées */
proc casutil incaslib='casuser'; list tables; run;
/* Nettoyage */
proc casutil incaslib='casuser'; droptable 'temp_one' 'temp_two'; run;
libname mycas clear;
libname work clear;
1
/* Établit une connexion CAS */
2
LIBNAME mycas cas s_port=10000 s_host='localhost' caslib='casuser' s_caslib='casuser';
3
4
/* Crée des données temporaires dans work */
5
DATA work.temp_one;
6
SET sashelp.cars;
7
where make = 'Audi';
8
RUN;
9
10
DATA work.temp_two;
11
SET sashelp.cars;
12
where make = 'BMW';
13
RUN;
14
15
/* Utilise PROC COPY pour transférer séquentiellement les tables vers CAS */
16
/* Cela est géré en interne par SAS pour éviter les conflits */
17
PROC COPY in=work out=mycas;
18
select temp_one temp_two;
19
RUN;
20
21
/* Vérification des tables créées */
22
PROC CASUTIL incaslib='casuser'; list tables; RUN;
Explication : Cet exemple se concentre sur une meilleure gestion des transferts de données volumineux vers CAS en utilisant l'option `WRITETRANSFERSIZE`. Plutôt qu'une petite valeur qui peut exacerber les problèmes de performance ou de concurrence, une valeur plus élevée (ici 1M pour 1 Mo) est utilisée pour optimiser le transfert. Bien que l'exemple 1 ait montré comment une petite valeur pouvait causer des erreurs dans des scénarios spécifiques, une valeur appropriée pour `WRITETRANSFERSIZE` est cruciale pour l'efficacité des opérations CAS, surtout pour l'ingestion de données massives. Cet exemple crée une seule grande table pour illustrer la performance d'un transfert optimisé.
Copié !
/* Établit une connexion CAS avec une taille de transfert optimisée */
/* Utiliser une valeur plus grande pour WRITETRANSFERSIZE */
libname mycas cas s_port=10000 s_host='localhost' caslib='casuser' s_caslib='casuser' writetransfersize=1m;
/* Crée une table de grande taille dans CAS */
data mycas.large_table;
do _n_ = 1 to 100000;
var1 = ranuni(0);
var2 = rand('NORMAL');
output;
end;
run;
/* Vérification de la table créée */
proc casutil incaslib='casuser'; list tables; run;
proc print data=mycas.large_table(obs=5); run;
/* Nettoyage */
proc casutil incaslib='casuser'; droptable 'large_table'; run;
libname mycas clear;
1
/* Établit une connexion CAS avec une taille de transfert optimisée */
2
/* Utiliser une valeur plus grande pour WRITETRANSFERSIZE */
3
LIBNAME mycas cas s_port=10000 s_host='localhost' caslib='casuser' s_caslib='casuser' writetransfersize=1m;
4
5
/* Crée une table de grande taille dans CAS */
6
DATA mycas.large_table;
7
DO _n_ = 1 to 100000;
8
var1 = ranuni(0);
9
var2 = rand('NORMAL');
10
OUTPUT;
11
END;
12
RUN;
13
14
/* Vérification de la table créée */
15
PROC CASUTIL incaslib='casuser'; list tables; 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.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.