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?
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 finden Sie unter Warum schlägt meine Amazon Athena-Abfrage mit dem Fehler: „HIVE_BAD_DATA: Fehler beim Parsing des Feldwerts für Feld X: Für die Eingabezeichenfolge: "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 der 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.
Behebung
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, stellen Sie sicher, dass jede Spalte Werte desselben Datentyps enthält und dass die Werte in den zulässigen Bereichen liegen.
Wenn Sie immer noch Fehlermeldungen erhalten, ändern Sie den Datentyp der Spalte zu einem kompatiblen Datentyp mit einem höheren Bereich. Wenn die Änderung des Datentyps das Problem nicht löst, probieren Sie die Behebungen 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" }
Data Definition Language (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/';
Data Manipulation Language (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, definieren Sie 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
Sie können auch in den gewünschten Datentyp umwandeln. Zum Beispiel können Sie eine Zeichenfolge in eine Ganzzahl umwandeln. Bei einigen Datentypen gibt dies jedoch möglicherweise Null- oder ungenaue Ergebnisse zurück, die Sie von und in übertragen. Werte, die nicht umgewandelt werden können, werden verworfen. Wenn Sie beispielsweise den Zeichenfolgenwert „0,54" in INT umwandeln, 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. Sie können diesen Wert nicht direkt aus einer Zeichenfolge in eine Ganzzahl umwandeln. Um dieses Problem zu lösen, verwenden Sie Funktion COALESCE, um die Werte gemischter Typen in dieselbe Spalte als Ausgabe zu übertragen. Führen Sie anschließend die Aggregatfunktion für die Spalte aus. 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ühren Sie 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 analysieren, 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, definieren Sie dieID-Spalte als** BIGINT**, die den Wert „49612833315“ lesen kann. „ Weitere Informationen finden Sie unter Integer-Typen.
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 finden Sie unter DECIMAL or NUMERIC type.
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, definieren Sie die Spalte mit einer Skala neu, die alle Eingabewerte erfasst. Verwenden Sie 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 definierter INT analysieren.
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, definieren Sie 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
- Themen
- Analytics
- Tags
- Amazon Athena
- Sprache
- Deutsch

Relevanter Inhalt
AWS OFFICIALAktualisiert vor 2 Jahren
AWS OFFICIALAktualisiert vor 2 Jahren
