Comment résoudre l'exception « HIVE_CURSOR_ERROR » lorsque j'effectue une requête sur une table dans Amazon Athena ?

Dernière mise à jour : 2021-05-14

Lorsque j'effectue des requêtes sur ma table Amazon Athena, j'obtiens une exception « HIVE_CURSOR_ERROR ».

Solution

Vous pouvez obtenir cette exception sous l'une des conditions suivantes :

  • Les objets de données de votre emplacement de table sont endommagés, ne sont pas valides ou sont incorrectement compressés.
  • Les enregistrements dans les données de table ne sont pas valides (exemple : un enregistrement JSON mal formé).

Exceptions courantes de HIVE_CURSOR_ERROR

Vous pouvez obtenir l'une des exceptions HIVE_CURSOR_ERROR suivantes lorsqu'il y a un problème avec les objets sous-jacents :

  • HIVE_CURSOR_ERROR : vérification d'en-tête incorrecte
  • HIVE_CURSOR_ERROR : type de bloc non valide
  • HIVE_CURSOR_ERROR : vérification des données incorrecte
  • HIVE_CURSOR_ERROR : fin inattendue du flux d'entrée
  • HIVE_CURSOR_ERROR : longueurs des blocs de données stockés non valides
  • HIVE_CURSOR_ERROR : code de distance non valide

Si vous avez récemment ajouté de nouveaux objets à votre emplacement de table Amazon Simple Storage Service (Amazon S3), assurez-vous que ces objets sont valides et ne sont pas endommagés. Téléchargez les objets, puis inspectez-les à l'aide d'un outil approprié. Par exemple, décompressez les objets compressés GZIP pour vérifier si la compression est valide.

Si votre table est partitionnée, vérifiez si vous êtes en mesure d'interroger des partitions individuelles. S'il y a de nouvelles partitions dans la table, elles peuvent contenir des objets qui ne sont pas valides.

Exceptions spécifiques HIVE_CURSOR_ERROR

HIVE_CURSOR_ERROR : la ligne n'est pas un objet JSON valide

Vous obtenez cette erreur lorsqu'une ligne de la table n'est pas un enregistrement JSON valide.

Pour résoudre ce problème, procédez comme suit :

  1. Recréez la table en ajoutant la propriété 'ignore.malformed.json' = 'true'.
  2. Interrogez la nouvelle table pour identifier les fichiers dont les enregistrements sont mal formés en exécutant une commande similaire à la suivante :
SELECT "$path" FROM example_table WHERE example_column = NULL

Pour plus d'informations, consultez Résoudre les erreurs JSON dans Amazon Athena et Options SerDe JSAN OpenX.

HIVE_CURSOR_ERROR : bloc non compressé endommagé

Vous obtenez cette erreur lorsque les objets de votre emplacement de table sont compressés en utilisant le format LZO.

Pour éviter d'obtenir cette erreur avec les données compressées LZO, recréez la table avec INPUTFORMAT « com.hadoop.mapred.DeprecatedLzoTextInputFormat ». Par exemple :

CREATE EXTERNAL TABLE example_table (
    example_column_1 STRING,
    example_column_2 STRING
)
STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://example_bucket/example_prefix/'

Vous pouvez également résoudre cette erreur en utilisant un format de compression différent.

HIVE_CURSOR_ERROR : impossible de lire la valeur à 0 dans le bloc 0 du fichier

Vous obtenez cette erreur lorsque vous avez des objets Parquet non valides dans le chemin S3. Vérifiez si vos objets Parquet contiennent des types de données DECIMAL. Si les objets Parquet contiennent des types de données DECIMAL et ont été écrits à l'aide de Spark, ils peuvent être incompatibles avec Hive. Pour vérifier cette condition, essayez de lire les objets Parquet à partir d'une tâche Spark.

Si vous pouvez lire les objets Parquet à l'aide d'une tâche Spark, réécrivez les objets Parquet en utilisant le mode hérité dans Spark avec la configuration suivante :

spark.sql.parquet.writeLegacyFormat = true

Pour plus d'informations sur les options de configuration Spark pour Parquet, consultez le Guide de configuration Spark SQL.

HIVE_CURSOR_ERROR : org.apache.hadoop.io.ArrayWritable ne peut pas être convertit en org.apache.hadoop.io.Text

Vous obtenez cette erreur si vous avez utilisé un SerDe incorrect lors de la définition de la table. Par exemple, la table peut utiliser un SerDe JSON, et les données source incluent des objets Parquet.

Pour résoudre cette erreur, vérifiez les données source et confirmez que le SerDe correct est utilisé. Pour plus d'informations, consultez SerDes et formats de données pris en charge.