Pourquoi est-ce que je reçois le message d’erreur « HIVE_BAD_DATA: Error parsing field value for field X for input string: » lorsque j’interroge des données JSON dans Amazon Athena ?
Lorsque j'interroge des données dans Amazon Athena, j'obtiens un message d'erreur similaire à l'un des suivants : « HIVE_BAD_DATA: Error parsing field value for field X for input string: » ou « HIVE_BAD_DATA: Error parsing column '0': target scale must be larger than source scale. »
Brève description
Il existe plusieurs versions de l'erreur ** HIVE \ _BAD \ ** _DATA. Le message d'erreur peut spécifier une chaîne d'entrée nulle ou vide, telle que " Pour la chaîne d'entrée : """. Pour ce type de message d’erreur, consultez Pourquoi ma requête Amazon Athena échoue-t-elle avec l’erreur « HIVE_BAD_DATA: Erreur parsing field value for field X: (Erreur lors de l'analyse de la valeur du champ X :) Pour la chaîne d'entrée : "12312845691""?
Les erreurs qui spécifient une chaîne d'entrée avec une valeur se produisent dans l'une des conditions suivantes :
- Le type de données défini dans la définition de la table ne correspond pas aux données source réelles.
- Un seul champ contient différents types de données, tels qu'une valeur entière pour un enregistrement et une valeur décimale pour un autre enregistrement.
Résolution
Il est recommandé de n'utiliser qu'un seul type de données dans une colonne. Dans le cas contraire, la requête risque d'échouer. Pour résoudre les erreurs, assurez-vous que chaque colonne contient des valeurs du même type de données et que les valeurs se situent dans les plages autorisées.
Si les erreurs persistent, remplacez le type de données de la colonne par un type de données compatible dont la plage est plus élevée. Si la modification du type de données ne résout pas le problème, essayez les solutions décrites dans les exemples suivants.
Exemple 1
- Format de la source : JSON
- **Problème :**Dans le dernier enregistrement, la valeur de la clé d'id est « 0,54 ». Cette valeur clé est le type de données DECIMAL. Pour les autres enregistrements, la valeur de la clé id est définie sur INT.
Données sources :
{ "id" : 50, "name":"John" } { "id" : 51, "name":"Jane" } { "id" : 53, "name":"Jill" } { "id" : 0.54, "name":"Jill" }
Déclaration du langage de définition des données (DDL) :
CREATE EXTERNAL TABLE jsontest_error_hive_bad_data ( id INT, name STRING ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true') LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data/';
Déclaration du langage de manipulation de données (DML) :
SELECT * FROM jsontest_error_hive_bad_data
Erreur :
HIVE_BAD_DATA: Error reading field value: For input string: "0.54" This query ran against the 'default' database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query ID: add6f434-3397-4c80-a55f-1672a0102e32
Pour résoudre ce problème, redéfinissez la colonne id en tant que STRING. Le type de données STRING peut représenter correctement toutes les valeurs de jeu de données.
Déclaration DDL modifiée :
CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_correct_id_data_type ( id STRING, name STRING ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true') LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data/';
Déclaration DML :
SELECT * FROM jsontest_error_hive_bad_data_correct_id_data_type
Vous pouvez également effectuer une conversion vers le type de données souhaité. Vous pouvez, par exemple, convertir une chaîne en un entier. Toutefois, pour certains types de données, cette méthode peut renvoyer des résultats nuls ou inexacts à partir desquels et vers lesquels vous effectuez une conversion. Les valeurs qui ne peuvent pas être converties sont ignorées. Par exemple, si vous convertissez la valeur de chaîne « 0,54 » en INT, les résultats nuls sont renvoyés :
SELECT TRY_CAST(id AS INTEGER) FROM jsontest_error_hive_bad_data_correct_id_data_type
Exemple de sortie :
Results _col0 1 50 2 51 3 53 4
La sortie indique que la valeur « 0,54 » a été supprimée. Vous ne pouvez pas convertir cette valeur directement d’une chaîne en un entier. Pour résoudre ce problème, utilisez la fonction COALESCE pour convertir les valeurs de type mixte dans la même colonne que la sortie. Ensuite, autorisez la fonction d’agrégation à exécuter sur la colonne. Exemple :
SELECT COALESCE(TRY_CAST(id AS INTEGER), TRY_CAST(id AS DECIMAL(10,2))) FROM jsontest_error_hive_bad_data_correct_id_data_type
Sortie :
Results _col0 1 50.00 2 51.00 3 53.00 4 0.54
Exécutez des fonctions d'agrégation :
SELECT SUM(COALESCE(TRY_CAST(id AS INTEGER), TRY_CAST(id AS DECIMAL(10,2)))) FROM jsontest_error_hive_bad_data_correct_id_data_type
Sortie :
_col01 154.54
Exemple 2
- Format de la source : JSON
- Problème : La colonne id est définie comme INT. Athena n'a pas pu analyser « 49612833315 » car la plage des valeurs INT dans Presto est -2147483648 et 2147483647.
Données sources :
{ "id" : 50, "name":"John" } { "id" : 51, "name":"Jane" } { "id" : 53, "name":"Jill" } { "id" : 49612833315, "name":"Jill" }
Déclaration DDL :
CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_sample_2 ( id INT, name STRING ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true') LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data_2/';
Déclaration DML :
SELECT * FROM jsontest_error_hive_bad_data_sample_2
Erreur :
HIVE_BAD_DATA: Error reading field value: For input string: "49612833315" This query ran against the 'default' database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query ID: 25be5ca1-0799-4c21-855d-b9171aadff47
Pour résoudre ce problème, définissez la ** colonne ** id comme ** BIGINT**, qui peut lire la valeur « 49612833315 ». « Pour plus d’informations, consultez la section Types d’entiers.
Déclaration DDL modifiée :
CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_sample_2_corrected ( id BIGINT, name STRING ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true') LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data_2/';
Exemple 3
- Format de la source : JSON
- **Problème :**Les données d'entrée sont ** DECIMAL ** et la colonne est définie comme ** DECIMAL ** dans la définition de la table. Toutefois, l'échelle est définie comme 2, et 2 ne correspond pas à la valeur « 0,000054 ». Pour plus d'informations, voir Type DÉCIMAL ou NUMÉRIQUE.
Données sources :
{ "id" : 0.50, "name":"John" } { "id" : 0.51, "name":"Jane" } { "id" : 0.53, "name":"Jill" } { "id" : 0.000054, "name":"Jill" }
Déclaration DDL :
CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_sample_3( id DECIMAL(10,2), name STRING ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true') LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data_3/';
Déclaration DML :
SELECT * FROM jsontest_error_hive_bad_data_sample_3
Erreur :
HIVE_BAD_DATA: Error Parsing a column in the table: target scale must be larger than source scale This query ran against the 'default' database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query ID: 97789f62-d2a5-4749-a506-26480a91a1db
Pour résoudre ce problème, redéfinissez la colonne avec une échelle qui capture toutes les valeurs d'entrée. Par exemple, au lieu de (10,2), utilisez (10,7).
Déclaration DDL modifiée :
CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_sample_3_corrected( id DECIMAL(10,7), name STRING ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true') LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data_3/';
Exemple 4
- Format de la source : JSON
- Problème : les données d’entrée sont STRING et la colonne est définie comme INT dans la définition de la table. Toutefois, Athena ne peut pas analyser l’enregistrement STRING, car la clé id est définie sur INT.
Données sources
{ "id" : 50, "name":"John" } { "id" : 51, "name":"Jane" } { "id" : 53, "name":"Jill" } { "id" : one, "name":"Jenny" }
Déclaration DDL :
CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_sample_4( id INT, name STRING ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true') LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data_4/';
Déclaration DML :
SELECT * FROM jsontest_error_hive_bad_data_sample_4
Erreur :
HIVE_BAD_DATA: Error reading field value: For input string: "one" This query ran against the 'default' database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query ID: 291b69f6-48f9-4381-af72-6786b3a90826
Cette erreur se produit parce que les données source réelles sont définies selon un type de données incompatible.
Pour résoudre ce problème, redéfinissez la colonne id en tant que STRING. Le type de données STRING peut représenter correctement toutes les valeurs de jeu de données. Exemple :
Déclaration DDL modifiée :
CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_sample_4_corrected ( id STRING, name STRING ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true') LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data_4/';
Informations connexes
Vidéos associées
Contenus pertinents
- demandé il y a un anlg...
- demandé il y a un anlg...
- demandé il y a un anlg...
- demandé il y a 8 moislg...
- AWS OFFICIELA mis à jour il y a 4 ans
- AWS OFFICIELA mis à jour il y a 8 mois
- AWS OFFICIELA mis à jour il y a 10 mois