Pourquoi est-ce que je reçois l'erreur "HIVE_BAD_DATA: Error parsing column '0': target scale must be larger than source scale." (Erreur lors de l'analyse de la valeur du champ '' pour le champ X :) Pour la chaîne d'entrée : """ lorsque j'interroge des données CSV dans Amazon Athena ?

Lecture de 7 minute(s)
0

Lorsque j'interroge des données dans Amazon Athena, j'obtiens un message d'erreur similaire à l'un des suivants : "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" or "HIVE_BAD_DATA: Error parsing column '0': target scale must be larger than source scale." (Erreur lors de l'analyse de la colonne « 0 » : l'échelle cible doit être supérieure à l'échelle source.")

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 :

Your query has the following error(s):
HIVE_BAD_DATA: Error parsing field value '0.54' for field 0: 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: bd50793b-94fc-42a7-b131-b7c81da273b2.

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 :

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é. Par exemple, vous pouvez convertir une chaîne sous forme d'entier. Toutefois, selon les types de données depuis et vers lesquels vous effectuez la conversion, cela peut renvoyer des résultats nuls ou inexacts. Les valeurs qui ne peuvent pas être converties sont ignorées. Par exemple, la conversion de la valeur de chaîne « 0,54 » en INT renvoie des résultats nuls :

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 COALESCE (à partir du site Web de Presto) 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 :

     _col0
1    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 :

Your query has the following error(s):
HIVE_BAD_DATA: Error parsing field value '49612833315' for field 0: 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: 05b55fb3-481a-4012-8c0d-c27ef1ee746f.

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 :

Your query has the following error(s):
HIVE_BAD_DATA: Error parsing column '0': 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: 1c3c7278-7012-48bb-8642-983852aff999.

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).

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/';
AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an
Aucun commentaire