SAS/ACCESS to Hadoop et les champs STRING : WARNING ou ERROR ?
Si vous travaillez avec le module SAS/ACCESS interface to Hadoop et que vos tables HADOOPcontiennent des champs type STRING (qui peuvent contenir jusqu'à 2go de données), vous avez déjà été confronté au problème de champs de 32K. Vous copiez vos données de votre cluster HADOOP vers SAS (dans votre work par exemple) et vous vous retrouvez rapidement avec des problèmes d’espace, pouvant aller jusqu’à la saturation de la Work . En effet, après rapatriement et malgré la faible volumétrie de vos données HADOOP, l’espace occupé, côté SAS, est disproportionné.
Ce problème se produit car SAS mappe les types de données STRING et d'autres types de données complexes à la longueur de caractères maximale possible, qui est CHAR (32767). Ce problème se produit quelle que soit la longueur réelle des données. Ce comportement provoque des problèmes de performances et entraîne la création de tables SAS inutilement volumineuses. D’ailleurs, si vous prêtez attention au warning présent dans votre journal SAS vous constatez le message suivant :
WARNING: SAS/ACCESS assigned this column a length of 32767. If the resulting SAS character variable remains this length, SAS performance is impacted.
J'ai abordé ce sujet dans mon article "SAS/ACCESS to Hadoop et les colonnes String (32k string thing)" et comme l'indique la documentation SAS :
Ainsi, pour contourner ce problème, vous pouvez utiliser l'option de LIBNAME DBMAX_TEXT. Si vous spécifiez l'option DBMAX_TEXT = dans la chaîne de connexion à Hadoop, la valeur est appliquée à toutes les colonnes de caractères.
Toutefois, si un utilisateur SAS accède à une table HADOOP mais qu'aucune des possibilités pour limiter l'occupation mémoire des champs STRING n'est mise en place, il recevra une WARNING dans log SAS mais les données seront bien rapatriées de façon disproportionné pouvant saturer le serveur. ( voir au début de cet article)
Pour éviter une saturation de votre environnement , il est possible de positionner une option SAS afin de BLOQUER le chargement des données si aucune limitation n'est mise en place. Ainsi, dés qu'une données STRING, non limitée via SASFMT ou si DBMAX_TEXT, est accédé le chargement sera interrompu et un message d'erreur s'affichera dans la log SAS.
En positionnant l'option SAS à SAS_HADOOP_FAIL_32767 à 1, le WARNING sera remplacé par un message d'erreur :
Sources et autres documentations :
Problem Note 63952: Queries of Hadoop tables return "WARNING: The following column could have a length in SAS of 32767..." and cause performance problems
Data Types for Hadoop > Issues When Converting Data from Hive to SAS
SAS/ACCESS to Hadoop et les colonnes String (32k string thing)
ERROR: SAS/ACCESS has failed the query because environment variable SAS_HADOOP_FAIL_32767 is set and column 'description' would be 32767 bytes when brought into SAS.
Pour positionner l'option, la syntaxe est la suivante :
1 |
options set = SAS_HADOOP_FAIL_32767 = "1"; |