Problèmes connus dans Athena pour Spark - Amazon Athena

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Problèmes connus dans Athena pour Spark

Cette page présente certains des problèmes connus d'Athena pour Apache Spark.

Exception d'argument non valide lors de la création d'une table

Bien que Spark n'autorise pas la création de bases de données avec une propriété d'emplacement vide, les bases de données AWS Glue peuvent avoir une LOCATION propriété vide si elles sont créées en dehors de Spark.

Si vous créez une table et spécifiez une AWS Glue base de données contenant un LOCATION champ vide, une exception comme celle-ci peut se produire IllegalArgumentException: Impossible de créer un chemin à partir d'une chaîne vide.

Par exemple, la commande suivante génère une exception si la base de données par défaut de AWS Glue contient un champ LOCATION vide :

spark.sql("create table testTable (firstName STRING)")

Solution suggérée A — AWS Glue À utiliser pour ajouter un emplacement à la base de données que vous utilisez.

Pour ajouter un emplacement à une AWS Glue base de données
  1. Connectez-vous à la AWS Glue console AWS Management Console et ouvrez-la à l'adresse https://console.aws.amazon.com/glue/.

  2. Dans le panneau de navigation, choisissez Databases (Bases de données).

  3. Dans la liste des bases de données, choisissez la base de données à modifier.

  4. Sur la page de détails de la base de données, sélectionnez Edit (Modifier).

  5. Sur la page Update a database (Mettre à jour une base de données), dans le champ Location (Emplacement), saisissez un emplacement Amazon S3.

  6. Choisissez Update Database (Mettre à jour la base de données).

Solution suggérée B – Utilisez une autre base de données AWS Glue qui a un emplacement existant et valide dans Amazon S3. Par exemple, si vous avez une base de données appelée dbWithLocation, utilisez la commande spark.sql("use dbWithLocation") pour passer à cette base de données.

Solution suggérée C – Lorsque vous utilisez Spark SQL pour créer la table, spécifiez une valeur pour location, comme dans l'exemple suivant.

spark.sql("create table testTable (firstName STRING) location 's3://DOC-EXAMPLE-BUCKET/'").

Solution suggérée D – Si vous avez indiqué un emplacement lors de la création de la table, mais que le problème persiste, assurez-vous que le chemin Amazon S3 que vous indiquez comporte une barre oblique à la fin. Par exemple, la commande suivante génère une exception d'argument non valide :

spark.sql("create table testTable (firstName STRING) location 's3://DOC-EXAMPLE-BUCKET'")

Pour corriger cela, ajoutez une barre oblique finale à l'emplacement (par exemple, 's3:// DOC-EXAMPLE-BUCKET/').

Base de données créée dans un emplacement de groupe de travail

Si vous utilisez une commande comme spark.sql('create database db') pour créer une base de données et que vous ne spécifiez pas d'emplacement pour la base de données, Athena crée un sous-répertoire dans l'emplacement de votre groupe de travail et utilise cet emplacement pour la base de données nouvellement créée.

Problèmes liés aux tables gérées par Hive dans la base de données AWS Glue par défaut

Si la Location propriété de votre base de données par défaut AWS Glue n'est pas vide et indique un emplacement valide dans Amazon S3, et que vous utilisez Athena for Spark pour créer une table gérée par Hive dans AWS Glue votre base de données par défaut, les données sont écrites à l'emplacement Amazon S3 spécifié dans votre groupe de travail Athena Spark plutôt qu'à l'emplacement spécifié par la base de données. AWS Glue

Ce problème se produit en raison de la façon dont Apache Hive gère sa base de données par défaut. Apache Hive crée des données de table dans l'emplacement racine de l'entrepôt Hive, qui peut être différent de l'emplacement de base de données par défaut réel.

Lorsque vous utilisez Athena pour Spark pour créer une table gérée par Hive sous la base de données par défaut dans AWS Glue, les métadonnées de la AWS Glue table peuvent pointer vers deux emplacements différents. Cela peut provoquer un comportement inattendu lorsque vous tentez une opération INSERT ou DROP TABLE.

Les étapes pour reproduire le problème sont les suivantes :

  1. Dans Athena pour Spark, vous utilisez l'une des méthodes suivantes pour créer ou enregistrer une table gérée par Hive :

    • Une instruction SQL telle que CREATE TABLE $tableName

    • Une telle PySpark commande df.write.mode("overwrite").saveAsTable($tableName) ne spécifie pas l'pathoption dans l'API Dataframe.

    À ce stade, la AWS Glue console peut indiquer un emplacement incorrect dans Amazon S3 pour la table.

  2. Dans Athena pour Spark, vous utilisez l'instruction DROP TABLE $table_name pour supprimer la table que vous avez créée.

  3. Après avoir exécuté l'instruction DROP TABLE, vous remarquez que les fichiers sous-jacents sont toujours présents dans Amazon S3.

Pour résoudre ce problème, procédez de l'une des manières suivantes :

Solution A — Utilisez une autre AWS Glue base de données lorsque vous créez des tables gérées par Hive.

Solution B : spécifiez un emplacement vide pour la base de données par défaut dans AWS Glue. Créez ensuite vos tables gérées dans la base de données par défaut.

Incompatibilité des formats de fichier CSV et JSON entre Athena pour Spark et Athena SQL

En raison d'un problème connu lié à Spark open source, lorsque vous créez une table dans Athena pour Spark sur des données CSV ou JSON, la table peut ne pas être lisible à partir d'Athena SQL, et vice versa.

Par exemple, vous pouvez créer une table dans Athena pour Spark de l'une des manières suivantes :

  • Utilisez la syntaxe USING csv suivante :

    spark.sql('''CREATE EXTERNAL TABLE $tableName ( $colName1 $colType1, $colName2 $colType2, $colName3 $colType3) USING csv PARTITIONED BY ($colName1) LOCATION $s3_location''')
  • Avec la syntaxe DataFramed'API suivante :

    df.write.format('csv').saveAsTable($table_name)

En raison du problème connu avec Spark open source, les requêtes d'Athena SQL sur les tables résultantes risquent d'échouer.

Solution suggérée : essayez de créer la table dans Athena pour Spark en utilisant la syntaxe Apache Hive. Pour plus d'informations, consultez CREATE HIVEFORMAT TABLE dans la documentation Apache Spark.