Perché la mia query su Amazon Athena fallisce con l'errore “HIVE_BAD_DATA: Errore durante l'analisi del valore del campo X: Per la stringa di input: "12312845691""?

6 minuti di lettura
0

Quando eseguo una query sui dati in Amazon Athena, ricevo un errore simile a uno dei seguenti: "HIVE_BAD_DATA: Errore durante l'analisi del valore del campo X: Per la stringa di input: "12312845691" "HIVE_BAD_DATA: Errore di parsing della colonna '0': la scala di destinazione deve essere maggiore della scala di origine”

Breve descrizione

Esistono diverse versioni dell'errore HIVE_BAD_DATA. Se il messaggio di errore specifica una stringa di input nulla o vuota (ad esempio, “Per la stringa di input: """), vedi Perché ricevo l'errore “HIVE_BAD_DATA: Errore durante l'analisi del valore del campo " per il campo X: Per la stringa di input: """ quando interrogo dati CSV in Amazon Athena?

Gli errori che specificano una stringa di input con un valore si verificano in una delle seguenti condizioni:

  • Il tipo di dati definito nella definizione della tabella non corrisponde ai dati di origine effettivi.
  • Un singolo campo contiene diversi tipi di dati, ad esempio un valore intero per un record e un valore decimale per un altro record.

Risoluzione

È consigliabile utilizzare un solo tipo di dati in una colonna. In caso contrario, l'interrogazione potrebbe fallire. Per risolvere gli errori, assicurati che ogni colonna contenga valori dello stesso tipo di dati e che i valori rientrino negli intervalli consentiti.

Se continui a ricevere errori, modifica il tipo di dati della colonna con un tipo di dati compatibile con un intervallo più elevato. Se la modifica del tipo di dati non risolve il problema, prova le soluzioni negli esempi seguenti.

Esempio 1

  • Formato sorgente: JSON
  • Problema: Nell'ultimo record, il valore della chiave “id” è “0.54”, che è il tipo di dati DECIMALE. Per gli altri record, il valore della chiave “id” è impostato su INT.

Dati di origine:

{ "id" : 50, "name":"John" }
{ "id" : 51, "name":"Jane" }
{ "id" : 53, "name":"Jill" }
{ "id" : 0.54, "name":"Jill" }

Dichiarazione DDL (Data Definition Language):

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/';

Dichiarazione DML (Data Manipulation Language):

SELECT *
FROM jsontest_error_hive_bad_data

Errore:

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.

Per risolvere questo problema, ridefinisci la colonna id come STRING. Il tipo di dati STRING può rappresentare correttamente tutti i valori di questo set di dati. Esempio:

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/';

Dichiarazione DML:

SELECT *
FROM jsontest_error_hive_bad_data_correct_id_data_type

Puoi anche eseguire un CAST sul tipo di dati desiderato. Ad esempio, puoi eseguire il cast su una stringa come numero intero. Tuttavia, a seconda dei tipi di dati da e verso cui converti, ciò potrebbe restituire risultati nulli o imprecisi. I valori che non possono essere generati vengono eliminati. Ad esempio, trasferendo il valore della stringa “0.54" su INT restituisce risultati nulli:

SELECT TRY_CAST(id AS INTEGER)
FROM jsontest_error_hive_bad_data_correct_id_data_type

Esempio di output:

Results
     _col0
1    50
2    51
3    53
4

L'output mostra che il valore “0,54" è stato scartato. Non puoi trasmettere quel valore direttamente da una stringa a un numero intero. Per risolvere questo problema, usa COALESCE (dal sito Web di Presto) per eseguire un CAST di valori di tipo misto nella stessa colonna dell'output. Quindi, consenti l'esecuzione della funzione di aggregazione sulla colonna. Esempio:

SELECT COALESCE(TRY_CAST(id AS INTEGER), TRY_CAST(id AS DECIMAL(10,2)))
FROM jsontest_error_hive_bad_data_correct_id_data_type

Uscita:

Results
     _col0
1    50.00
2    51.00
3    53.00
4    0.54

Esegui funzioni aggregate:

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

Uscita:

_col0
1    154.54

Esempio 2

  • Formato sorgente: JSON
  • Problema: La colonna “id” è definita come INT. Athena non è riuscita ad analizzare "49612833315" perché l'intervallo per i valori INT in Presto è compreso tra -2147483648 e 2147483647.

Dati di origine:

{ "id" : 50, "name":"John" }
{ "id" : 51, "name":"Jane" }
{ "id" : 53, "name":"Jill" }
{ "id" : 49612833315, "name":"Jill" }

Dichiarazione 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/';

Dichiarazione DML:

SELECT *
FROM jsontest_error_hive_bad_data_sample_2

Errore:

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.

Per risolvere questo problema, definisci la colonna id come BIGINT, che può leggere il valore “49612833315”. Per ulteriori informazioni, vedere Tipi di numeri interi.

Dichiarazione DDL modificata:

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/';

Esempio 3

  • Formato sorgente: JSON
  • Problema: I dati di input sono DECIMAL e la colonna è definita come DECIMAL nella definizione della tabella. Tuttavia, la scala è definita come 2 e non corrisponde al valore “0,000054". Per ulteriori informazioni, vedere Tipo DECIMALE o NUMERICO.

Dati di origine:

{ "id" : 0.50, "name":"John" }
{ "id" : 0.51, "name":"Jane" }
{ "id" : 0.53, "name":"Jill" }
{ "id" : 0.000054, "name":"Jill" }

Dichiarazione 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/';

Dichiarazione DML:

SELECT *
FROM jsontest_error_hive_bad_data_sample_3

Errore:

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.

Per risolvere questo problema, ridefinisci la colonna con una scala che acquisisca tutti i valori di input. Ad esempio, anziché (10,2), usa (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 UFFICIALE
AWS UFFICIALEAggiornata 3 anni fa