Comment résoudre les erreurs d'incompatibilité des données dans Redshift Spectrum ?

Date de la dernière mise à jour : 15/10/2020

J'essaie d'utiliser un schéma, un objet ou un format de fichier externe dans Amazon Redshift Spectrum. Cependant, je reçois une erreur. Comment résoudre ces erreurs ?

Résolution

Erreur de format de données incompatibles

Pour résoudre votre erreur de format de données incompatibles dans Redshift Spectrum, effectuez les étapes suivantes :

1.    Récupérez le message d'erreur complet à partir de la vue système SVL_S3LOG :

select * from SVL_S3LOG where query = '<query_ID_of_the_Spectrum_query>';

Une incompatibilité dans un schéma Parquet incompatible génère le message d'erreur suivant :

File 'https://s3bucket/location/file has an incompatible Parquet schema for column ‘s3://s3bucket/location.col1'. Column type: VARCHAR, Par...

2.    Vérifiez la colonne Message pour afficher la description de l'erreur. La description de l'erreur explique l'incompatibilité des données entre Redshift Spectrum et le fichier externe.

3.    Vérifiez le schéma de votre fichier externe, puis comparez-le avec la définition de colonne dans la définition CREATE EXTERNAL TABLE.

4.    (Facultatif) Si la définition de colonne dans le fichier Apache Parquet diffère de la table externe, modifiez la définition de colonne dans la table externe. La définition de colonne doit correspondre au format de fichier en colonnes du fichier Apache Parquet.

5.    Exécutez la requête suivante pour la vue SVV_EXTERNAL_COLUMNS :

select * from SVV_EXTERNAL_COLUMNS where schemaname = '<ext_schema_name>' and tablename = '<ext_table_name>';

Cette requête vérifie le type de données de la colonne dans la définition CREATE EXTERNAL TABLE.

Remarque : pour les formats de fichier en colonnes tels qu'Apache Parquet, le type de colonne est incorporé aux données. Le type de colonne dans la définition CREATE EXTERNAL TABLE doit correspondre au type de colonne du fichier de données. Des définitions de colonne non concordantes entraînent une erreur d'incompatibilité des données.

Erreur de longueur de type non valide

Si vous sélectionnez une table Redshift Spectrum avec des colonnes de type de données DÉCIMAL, vous pouvez rencontrer l'erreur suivante :

S3 Query Exception (Fetch). Task failed due to an internal error. File ‘https://s3.amazonaws.com/…/<file_name>’ has an incompatible Parquet schema for column ‘<column_name>’
column ‘<column_name>’ has an invalid type length

Pour résoudre l'erreur de longueur de type non valide dans Redshift Spectrum, utilisez une définition de table externe. La définition de la table doit correspondre aux valeurs « précision » et « dimensionnement » définies dans le fichier externe. Par exemple :

create external table ext_schema.tablename (c1 int, c2 decimal (6,2)) stored as PARQUET location 's3://.../.../';

Dans cet exemple, les valeurs mises à jour (dans la colonne décimale c2 ) pour les valeurs « précision » et « dimensionnement » sont respectivement définies sur 6 et 2. Par conséquent, les valeurs de définition CREATE EXTERNAL TABLE répertoriées dans la colonne c2 doivent correspondre aux valeurs définies dans le fichier Apache Parquet.

Erreur interne

Si vous sélectionnez un schéma externe à partir d'un catalogue Amazon Athena, vous pouvez recevoir l'erreur suivante dans Redshift Spectrum :

Task failed due to an internal error. File 'https://s3...snappy.parquet  has an incompatible Parquet schema for column 's3://.../tbl.a'. Column type: BOOLEAN, Parquet schema:\noptional int32 b [i:26 d:1 r:0]

Dans Redshift Spectrum, l'ordre des colonnes dans CREATE EXTERNAL TABLE doit correspondre à l'ordre des champs dans le fichier Parquet. Pour les fichiers Apache Parquet, tous les fichiers doivent avoir le même ordre de champs que dans la définition de table externe. Si vous ignorez cet ordre ou réorganisez une colonne de type de données, vous recevez une erreur interne.

Remarque : bien que vous puissiez importer des catalogues de données Amazon Athena dans Redshift Spectrum, l'exécution d'une requête peut ne pas fonctionner dans Redshift Spectrum. Dans Redshift Spectrum, les noms de colonne sont mis en correspondance avec les champs du fichier Apache Parquet. Pendant ce temps, Amazon Athena utilise les noms des colonnes pour mapper aux champs du fichier Apache Parquet.

Pour résoudre l'erreur interne, spécifiez les noms de colonne suivants dans l'instruction SELECT :

select col_1, col_2, col_3, .... col_n from athena_schema.tablename;

Assurez-vous également que le rôle AWS Identity and Access Management (IAM) autorise l'accès à Amazon Athena. Pour plus d'informations, consultez les stratégies IAM pour Amazon Redshift Spectrum.

Erreur de type de colonne non valide

Si vous utilisez Redshift Spectrum pour interroger les colonnes de type de données VARCHAR à partir d'une table AWS Glue Data Catalog l'erreur suivante peut s'afficher :

<column_name> - Invalid column type for column <column_name>. Type: varchar"

AWS Glue et Redshift Spectrum prennent en charge le type de données VARCHAR. Cependant, le type de données VARCHAR défini par AWS Glue Catalog n'inclut pas de paramètre de taille (tel que VARCHAR (256)). Lorsque Redshift Spectrum interroge une colonne VARCHAR définie sans paramètre de taille, le résultat est une erreur de type de colonne non valide.

Pour résoudre l'erreur de type de colonne non valide, effectuez les étapes suivantes :

1.    Exécutez la syntaxe de l'interface de ligne de commande AWS (AWS CLI) suivante pour récupérer et stocker les données de la table AWS Glue dans un fichier local :

aws glue get-table --region us-east-1 --database gluedb --name click_data_json > click-data-table.json

Remarque : vous recevez une erreur lors de l'exécution d'une commande AWS CLI, veillez à utiliser la version la plus récente de l'AWS CLI.

2.    Ouvrez le fichier click-data-table.json à l'aide d'un éditeur de texte et supprimez l’enveloppe externe {"Table": ...}. Par exemple, la configuration mise à jour devrait maintenant se lire comme ceci :

{"Name": "my-table", ...}

3.    Supprimez tous les champs qui ne sont pas autorisés dans l'action UpdateTable. Par exemple, vous pouvez supprimer les champs suivants :
DatabaseName
Propriétaire
CreateTime
UpdateTime
LastAccessTime
CrééePar
estRegisteredWithLakeFormation.

4.    Modifiez les types de colonne CHAÎNE en « varchar » avec le paramètre de taille souhaité. Par exemple :

"Type": "varchar(1000)"

5.    Utilisez la syntaxe de commande suivante pour mettre à jour votre table AWS Glue :

aws glue update-table --region us-east-1 --database gluedb --table-input "$(cat click-data-table.json)"

6.    Vérifiez la définition de votre table dans AWS Glue et vérifiez que les types de données ont été modifiés.

7.    Interrogez la table AWS Glue pour le schéma externe dans Amazon Redshift. Par exemple :

create external schema glue_schema from data catalog database ‘gluedb’ iam_role 'arn:aws:iam::111111111111:role/myRedshiftRole' region 'us-east-1';

8.    Exécutez la requête suivante pour click_data_json :

select * from glue_schema.click_data_json;

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?