Direkt zum Inhalt

Warum erhalte ich die Fehlermeldung „HIVE_BAD_DATA: Error parsing field value for field X for input string:“, wenn ich JSON-Daten in Amazon Athena abfrage?

Lesedauer: 6 Minute
0

Wenn ich Daten in Amazon Athena abfrage, erhalte ich eine Fehlermeldung, die einer der folgenden ähnelt: „HIVE_BAD_DATA: Error parsing field value for field X for input string:“ oder „HIVE_BAD_DATA: Error parsing column '0': target scale must be larger than source scale.“

Kurzbeschreibung

Es gibt mehrere Versionen des Fehlers HIVE_BAD_DATA. In der Fehlermeldung kann eine leere Eingabezeichenfolge angegeben werden, z. B. „For input string: "".“ Informationen zu dieser Art von Fehlermeldung findest du unter Warum schlägt meine Amazon-Athena-Abfrage mit dem Fehler: „HIVE_BAD_DATA: Error parsing field value for field X: For input string: "12312845691" fehl“?

Fehler, die eine Eingabezeichenfolge mit einem Wert angeben, treten unter einer der folgenden Bedingungen auf:

  • Der in der Tabellendefinition definierte Datentyp stimmt nicht mit dem den tatsächlichen Quelldaten überein.
  • Ein einzelnes Feld enthält verschiedene Datentypen, z. B. einen Ganzzahlenwert für einen Datensatz und einen Dezimalwert für einen anderen Datensatz.

Lösung

Es hat sich bewährt, nur einen Datentyp in einer Spalte zu verwenden. Andernfalls schlägt die Abfrage möglicherweise fehl. Um Fehler zu beheben, stelle sicher, dass jede Spalte Werte desselben Datentyps enthält und dass die Werte in den zulässigen Bereichen liegen.

Wenn du immer noch Fehlermeldungen erhältst, ändere den Datentyp der Spalte in einen kompatiblen Datentyp mit einem höheren Bereich. Wenn die Änderung des Datentyps das Problem nicht löst, probiere die Lösungen in den folgenden Beispielen aus.

Beispiel 1

  • Quellformat: JSON
  • Problem: Im letzten Datensatz lautet der id-Schlüsselwert „0,54“. Dieser Schlüsselwert ist der DECIMAL-Datentyp. Für die anderen Datensätze wird der id-Schlüsselwert auf INT gesetzt.

Quelldaten:

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

Datenbeschreibungssprach (DDL)-Anweisung:

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

Datenbearbeitungssprach (DML)-Anweisung:

SELECT * FROM jsontest_error_hive_bad_data

Fehler:

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

Um dieses Problem zu beheben, definiere die id-Spalte als STRING neu. Der STRING-Datentyp kann alle Werte in diesem Datensatz korrekt darstellen.

Modifizierte DDL-Anweisung:

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

DML-Anweisung:

SELECT * FROM jsontest_error_hive_bad_data_correct_id_data_type

Du kannst den Datentyp auch in den gewünschten Datentyp umwandeln. Zum Beispiel kannst du eine Zeichenfolge in eine Ganzzahl umwandeln. Bei einigen Datentypen gibt dies jedoch möglicherweise Null- oder ungenaue Ergebnisse zurück, wenn du von und in Datentypen umwandelst. Werte, die nicht umgewandelt werden können, werden verworfen. Wenn du beispielsweise den Zeichenfolgenwert „0,54“ in INT umwandelst, werden Nullergebnisse zurückgegeben:

SELECT TRY_CAST(id AS INTEGER) FROM jsontest_error_hive_bad_data_correct_id_data_type

Beispielausgabe:

Results     _col0
1    50
2    51
3    53
4

Die Ausgabe zeigt, dass der Wert „0,54“ verworfen wurde. Du kannst diesen Wert nicht direkt aus einer Zeichenfolge in eine Ganzzahl umwandeln. Um dieses Problem zu lösen, verwende die Funktion COALESCE, um die Werte kombinierter Typen in dieselbe Spalte als Ausgabe umzuwandeln. Lasse anschließend die Aggregatfunktion auf der Spalte ausführen. Beispiel:

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

Ausgabe:

Results     _col0
1    50.00
2    51.00
3    53.00
4    0.54

Führe Aggregatfunktionen aus:

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

Ausgabe:

  _col01    154.54

Beispiel 2

  • Quellformat: JSON
  • Problem: Die id-Spalte ist als INT definiert. Athena konnte „49612833315“ nicht parsen, da der Bereich für INT-Werte in Presto zwischen -2147483648 und 2147483647 liegt.

Quelldaten:

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

DDL-Anweisung:

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

DML-Anweisung:

SELECT * FROM jsontest_error_hive_bad_data_sample_2

Fehler:

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

Um dieses Problem zu beheben, definiere dieID-Spalte alsBIGINT, die den Wert „49612833315“ lesen kann. Weitere Informationen findest du unter Ganzzahltypen.

Modifizierte DDL-Anweisung:

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

Beispiel 3

  • Quellformat: JSON
  • Problem: Die Eingabedaten sind DECIMAL und die Spalte ist in der Tabellendefinition als DECIMAL definiert. Die Skala ist jedoch als 2 definiert, und 2 entspricht nicht dem Wert „0,000054“. Weitere Informationen findest du unter Typ DECIMAL oder NUMERIC.

Quelldaten:

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

DDL-Anweisung:

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

DML-Anweisung:

SELECT * FROM jsontest_error_hive_bad_data_sample_3

Fehler:

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

Um dieses Problem zu beheben, definiere die Spalte mit einer Skala neu, die alle Eingabewerte erfasst. Verwende beispielsweise (10,7) anstelle von (10,2).

Modifizierte DDL-Anweisung:

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

Beispiel 4

  • Quellformat: JSON
  • Problem: Die Eingabedaten sind STRING, und die Spalte ist in der Tabellendefinition als INT definiert. Athena kann den Datensatz STRING jedoch nicht als vom id-Schlüssel definierten INT parsen.

Quelldaten

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

DDL-Anweisung:

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

DML-Anweisung:

SELECT * FROM jsontest_error_hive_bad_data_sample_4

Fehler:

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

Dieser Fehler tritt auf, weil die tatsächlichen Quelldaten eine inkompatible Datentypdefinition haben.

Um dieses Problem zu beheben, definiere die id-Spalte als STRING neu. Der STRING-Datentyp kann alle Werte in diesem Datensatz korrekt darstellen. Beispiel:

Modifizierte DDL-Anweisung:

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

Ähnliche Informationen

JSON-bezogene Fehler

Problembehandlung in Athena

AWS OFFICIALAktualisiert vor 2 Jahren