Comment résoudre l'erreur « FAILED: NullPointerException Name is null » lorsque j'effectue une requête sur une table dans Amazon Athena ?

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

J'obtiens l'erreur « FAILED: NullPointerException Name is Null » lorsque j'effectue une requête sur ma table Amazon Athena.

Brève description

Vous obtenez cette erreur 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 si la table est une table externe ou un aperçu. Cet attribut peut être défini avec des valeurs, telles que EXTERNAL_TABLE et VIRTUAL_VIEW. Si vous souhaitez exécuter des requêtes DDL, telles que SHOW CREATE TABLE ou MSCK REPAIR TABLE, vous devez définir l'attribut TableType.

Vous pouvez obtenir cette erreur si vous avez défini la table à l'aide d'un modèle AWS CloudFormation ou de l'API AWS Glue sans spécifier TableType comme l'une des propriétés.

Solution

Pour résoudre cette erreur, effectuez une ou plusieurs des opérations suivantes, en fonction de votre cas d'utilisation :

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

Ajouter l'attribut TableType lors de la création de la table

Remarque : si la table est créée à l'aide d'une instruction DDL ou d'un analyseur AWS Glue, la propriété TableType est définie automatiquement.

Mettre à jour le modèle CloudFormation ou l'appel d'API AWS Glue

Si la table est définie à l'aide d'un modèle CloudFormation ou de l'API AWS Glue sans spécifier TableType, mettez à jour le modèle CloudFormation ou l'appel d'API AWS Glue pour ajouter l'attribut TableType.

Mettre à jour la table en utilisant l'interface de ligne de commande AWS (AWS CLI)

Pour mettre à jour l'attribut TableType de votre table, utilisez la commande AWS CLI aws glue update-table. Pour exécuter cette commande, vous devez disposer de l'objet TableInput qui définit toute l'architecture de la table.

Pour obtenir l'objet TableInput de votre table, exécutez la commande aws glue get-table. Ensuite, mettez à jour la sortie de cette commande tel que défini dans les étapes suivantes.

Remarque : en cas d'erreurs lors de l'exécution de commandes depuis AWS CLI, assurez-vous d'utiliser la version d'AWS CLI la plus récente.

1.    Exécutez sur votre table une commande similaire à la suivante :

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

2.    Vous obtenez un résultat similaire à ce qui suit :

{
    "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"
    }
}

3.    Supprimez des paramètres, tels que UpdateTime, IsRegisteredWithLakeFormation, CreatedBy, DatabaseName et CreateTime de la sortie ci-dessus. AWS Glue ne prend pas en charge ces paramètres. Si vous incluez ces paramètres dans l'attribut TableInput lorsque vous exécutez la commande update-table, les erreurs suivantes peuvent s'afficher :

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

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

5.    Utilisez la sortie comme paramètre TableInput pour exécuter la commande update-table.

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"
    }

Assurez-vous de remplacer ce qui suit dans les commandes ci-dessus :

  • doc_example_database par le nom de votre base de données
  • doc_example_table par le nom de votre table
  • 1111222233334444 par l'ID de votre compte
  • s3://doc_example_bucket/doc_example_prefix/ par l'emplacement Amazon Simple Storage Service (Amazon S3) où la table est stockée

Après avoir exécuté la commande ci-dessus, le paramètre TableType est mis à jour, et les requêtes DDL telles que SHOW CREATE TABLE ou MSCK REPAIR TABLE réussissent.


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


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