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?

Lesedauer: 6 Minute
0

Wenn ich Daten in Amazon Athena abfrage, erhalte ich eine Fehlermeldung, die einer der folgenden ähnelt: „HIVE_BAD_DATA: Fehler beim Parsing des Feldwerts für Feld X: Für die Eingabezeichenfolge: „12312845691“ „HIVE_BAD_DATA: Fehler beim Parsing von Spalte „0“: Zielskala muss größer als Quellskala sein“

Kurzbeschreibung

Es gibt mehrere Versionen des HIVE_BAD_DATA-Fehlers. Wenn die Fehlermeldung eine Null oder eine leere Eingabezeichenfolge angibt (z. B. „Für die Eingabezeichenfolge: „““), siehe Warum erhalte ich die Fehlermeldung „HIVE\ _BAD\ _DATA: Fehler beim Parsing des Feldwerts " für Feld X: Für Eingabezeichenfolge: „““ wenn ich CSV-Daten in Amazon Athena abfrage?

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

  • Der in der Tabellendefinition definierte Datentyp stimmt nicht mit 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, 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 Fehler erhalten, ändern Sie den Datentyp der Spalte zu einem kompatiblen Datentyp mit einem höheren Bereich. Wenn eine Änderung des Datentyps das Problem nicht löst, probieren Sie die Lösungen in den folgenden Beispielen aus.

Beispiel 1

  • Quellformat: JSON
  • Problem: Im letzten Datensatz lautet der Schlüsselwert „id“ „0,54“, was dem DECIMAL-Datentyp entspricht. Für die anderen Datensätze ist 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:

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.

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:

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. Sie können beispielsweise eine Zeichenfolge in eine Ganzzahl umwandeln. Abhängig von den Datentypen, von denen und in die Sie übertragen, kann dies jedoch zu Nullwerten oder falschen Ergebnissen führen. 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

Beispiel für eine Ausgabe:

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 COALESCE (von der Presto-Website), um die Werte gemischter Typen in derselben Spalte als Ausgabe umzuwandeln. 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:

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

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.

Um dieses Problem zu beheben, definieren Sie die „id“-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 was nicht dem Wert „0,000054“ entspricht. Weitere Informationen finden Sie unter DECIMAL- oder NUMERIC-Typ.

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:

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.

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

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 OFFICIAL
AWS OFFICIALAktualisiert vor 3 Jahren