Comment puis-je corriger l’erreur « FAILED: NullPointerException Name is null » qui survient lorsque j'interroge une table dans Athena ?

Lecture de 7 minute(s)
0

Lorsque j'interroge ma table Amazon Athena, le message d’erreur « FAILED: NullPointerException Name is Null » s’affiche.

Brève description

Les messages d'erreur suivants sont les types d'erreurs FAILED: NullPointerException que vous pouvez recevoir.

NullPointerException Name is null

Cette erreur s'affiche lorsque l'attribut TableType n'est pas défini pour la table interrogée dans le catalogue de données AWS Glue. L'attribut TableType définit s'il s'agit d'une table externe ou d'une vue. Vous pouvez définir l'attribut avec des valeurs telles que EXTERNAL_TABLE et VIRTUAL_VIEW.

Pour pouvoir exécuter des requêtes DDL telles que SHOW CREATE TABLE ou MSCK REPAIR TABLE, vous devez définir l'attribut TableType.

Cette erreur peut également s'afficher lorsque vous utilisez un modèle AWS CloudFormation ou l'API AWS Glue sans spécifier la propriété TableType.

java.lang.NullPointerException: Cannot invoke "java.util.Map.entrySet()" because the return value of "org.apache.hadoop.hive.metastore.api.SerDeInfo.getParameters()" is null

Cette erreur s'affiche lorsque les paramètres SerDeInfo ne sont pas définis pour la table interrogée dans le catalogue de données. Les paramètres SerDeInfo sont les paires clé-valeur qui définissent les paramètres d'initialisation du SerDe. Vous pouvez définir l'attribut avec la valeur « serialization.format » : « 1 ». Pour pouvoir exécuter des requêtes DDL telles que SHOW CREATE TABLE, vous devez définir les paramètres de l'attribut SerDeInfo.

Cette erreur peut également s'afficher lorsque vous utilisez un modèle CloudFormation ou l'API AWS Glue sans spécifier l’attribut SerDeInfo.

Résolution

Suivez les étapes de dépannage qui correspondent le mieux au message d'erreur que vous avez reçu.

Remarque : si des erreurs surviennent lorsque vous exécutez des commandes de l’interface de la ligne de commande AWS (AWS CLI), consultez la page Résoudre les erreurs liées à AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l’AWS CLI.

NullPointerException Name is null

Pour résoudre cette erreur, utilisez une ou plusieurs des actions suivantes en fonction de votre cas d'utilisation.

Ajoutez l'attribut lors de la création de la table

Lorsque vous créez la table, ajoutez l'attribut TableType.

Remarque : Si vous utilisez une instruction DDL ou un robot AWS Glue pour créer la table, la propriété TableType est définie automatiquement.

Chargez le modèle CloudFormation

Lorsque vous utilisez un modèle CloudFormation pour créer une table AWS Glue, spécifiez l'attribut TableType dans les propriétés TableInput de la ressource AWS Glue Table. Définissez le paramètre TableType sur « EXTERNAL_TABLE ». Pour plus d'informations, consultez la section AWS::Glue::Table TableInput.

Mettez à jour l'appel d'API AWS Glue

Lorsque vous utilisez l'appel d'API AWS Glue pour créer ou mettre à jour des tables, veillez à inclure le paramètre TableType dans vos propriétés TableInput. Lorsque vous appelez les opérations CreateTable ou UpdateTable, définissez le paramètre TableType sur « EXTERNAL_TABLE ».

Utilisez l'AWS CLI pour mettre à jour la table

Pour mettre à jour l'attribut TableType de votre table, exécutez la commande update-table dans l'AWS CLI. Pour exécuter cette commande, vous devez disposer de l'objet TableInput qui définit l'architecture complète de la table.

Pour obtenir l'objet TableInput pour votre table, exécutez la commande get-table dans l'AWS CLI. Puis, procédez comme suit pour mettre à jour la sortie de cette commande :

  1. Dans votre table, exécutez une commande sur la base de l’exemple suivant :

    aws glue get-table --catalog-id 1111222233334444 --database doc_example_database --name doc_example_table

    Exemple de sortie :

    {    "Table": {            "StorageDescriptor": {
                "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
                "SortColumns": [],
                "InputFormat": "org.apache.hadoop.mapred.TextInputFormat",
                "SerdeInfo": {
                        "SerializationLibrary": "org.apache.hadoop.hive.serde2.OpenCSVSerde",
                        "Parameters": {
                        "serialization.format": "1"
                            }
                },
                "Parameters": {
                    "separatorChar": ","
                },
                "Location": "s3://doc_example_bucket/doc_example_prefix/",
                "NumberOfBuckets": 0,
                "StoredAsSubDirectories": false,
                "Columns": [
                    {
                        "Type": "int",
                        "Name": "id"
                    },
                    {
                        "Type": "string",
                        "Name": "name"
                    }
                ],
                "Compressed": false
            },
            "UpdateTime": 1620508098.0,
            "IsRegisteredWithLakeFormation": false,
            "Name": "doc_example_table",
            "CreatedBy": "arn:aws:iam::1111222233334444:user/Administrator",
            "DatabaseName": "doc_example_database",
            "Owner": "1111222233334444",
            "Retention": 0,
            "CreateTime": 1619909955.0,
            "Description": "tb description"
        }
    }
  2. Dans la sortie, supprimez les paramètres UpdateTime, IsRegisteredWithLakeFormation, CreatedBy, DatabaseName et CreateTime. Ces paramètres ne sont pas pris en charge par AWS Glue.
    Si vous incluez ces paramètres dans l'attribut TableInput lorsque vous exécutez la commande update-table, les erreurs suivantes peuvent survenir :

    « Parameter validation failed:Unknown parameter in TableInput: « UpdateTime », must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters »
    « Unknown parameter in TableInput: « IsRegisteredWithLakeFormation », must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters »
    « Unknown parameter in TableInput: « CreatedBy », must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters »
    « Unknown parameter in TableInput: « DatabaseName » must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters »
    « Unknown parameter in TableInput: « CreateTime », must be one of: Name, Description, Owner, LastAccessTime, LastAnalyzedTime, Retention, StorageDescriptor, PartitionKeys, ViewOriginalText, ViewExpandedText, TableType, Parameters »

  3. Ajoutez le paramètre « TableType » : « EXTERNAL_TABLE » à la sortie.

  4. Utilisez la sortie en tant que paramètre TableInput pour exécuter la commande suivante :

    aws glue update-table --catalog-id 1111222233334444 --database-name doc_example_database --table-input '{        "StorageDescriptor": {            "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
                "SortColumns": [],
                "InputFormat": "org.apache.hadoop.mapred.TextInputFormat",
                "SerdeInfo": {
                    "SerializationLibrary": "org.apache.hadoop.hive.serde2.OpenCSVSerde",
                    "Parameters": {
                        "serialization.format":"1"
                    }
                },
                "Parameters": {
                    "separatorChar":","
                },
                "Location": "s3://doc_example_bucket/doc_example_prefix/",
                "NumberOfBuckets": 0,
                "StoredAsSubDirectories": false,
                "Columns": [
                    {
                        "Type": "int",
                        "Name": "id"
                    },
                    {
                        "Type": "string",
                        "Name": "name"
                    }
                ],
                "Compressed": false
            },
            "Name": "doc_example_table",
            "TableType": "EXTERNAL_TABLE",
            "Owner": "1111222233334444",
            "Retention": 0,
            "Description": "tb description"
        }'

    Remarque : Remplacez les variables suivantes :
    doc_example_database par le nom de votre base de données
    doc_example_table par le nom de votre table
    1111222233334444 par votre ID de compte AWS
    s3://doc_example_bucket/doc_example_prefix/ par l'emplacement Amazon Simple Storage Service (Amazon S3) où votre table est stockée
    Une fois la commande précédente exécutée, le paramètre TableType est mis à jour et les requêtes DDL sont réussies.

java.lang.NullPointerException: Cannot invoke "java.util.Map.entrySet()" because the return value of "org.apache.hadoop.hive.metastore.api.SerDeInfo.getParameters()" is null

Pour résoudre cette erreur, utilisez une ou plusieurs des actions suivantes en fonction de votre cas d'utilisation.

Ajouter les paramètres SerDeInfo lors de la création de la table

Lorsque vous créez la table, ajoutez des paramètres SerDeInfo, tels que ** « serialization.format » : « 1 », « field.delim » :« , »**.

Chargez le modèle CloudFormation

Lorsque vous utilisez un modèle CloudFormation pour créer une table AWS Glue, spécifiez les paramètres SerDeInfo. Dans la section TableInput de votre ressource Glue Table, accédez à StorageDescriptor. Sélectionnez SerDeInfo, puis Paramètres. Ajoutez {"serialization.format": "1"} en tant que paramètre.

Pour plus d'informations, consultez la section AWS::Glue::Table SerdeInfo.

Mettez à jour l'appel d'API AWS Glue

Lorsque vous utilisez l'appel d'API AWS Glue pour créer ou mettre à jour des tables, incluez les paramètres SerDeInfo dans le StorageDescriptor de votre TableInput. Définissez le champ Paramètres de SerDeInfo sur {"serialization.format": « 1 »}.

Ce paramètre est utilisé lorsque vous appelez des opérations telles que CreateTable ou UpdateTable. Pour plus d'informations, consultez la section Structure de StorageDescriptor.

Utiliser la console AWS Glue pour mettre à jour la table

Pour mettre à jour les propriétés de la table dans le catalogue de données, procédez comme suit :

  1. Ouvrez la console AWS Glue.
  2. Dans le volet de navigation, sous Catalogue de données, sélectionnez Tables.
  3. Sélectionnez la table que vous souhaitez mettre à jour.
  4. Sélectionnez Action, puis Modifier la table.
  5. Dans la section Paramètres SerDe, sélectionnez Ajouter.
  6. Dans Clé, saisissez « serialization.format », et dans Valeur indiquez « 1 ».
  7. Choisissez Enregistrer.

Utilisez l'AWS CLI pour mettre à jour la table

Pour mettre à jour les paramètres SerDeInfo de votre table, exécutez la commande update-table dans l'AWS CLI. Pour exécuter cette commande, vous devez disposer de l'objet TableInput qui définit l'architecture complète de la table.

Pour obtenir l'objet TableInput pour votre table, exécutez la commande get-table dans l'AWS CLI. Puis. mettez à jour la sortie de cette commande pour inclure les paramètres SerDeInfo.

Informations connexes

Résoudre les problèmes liés à Athena

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 5 mois