Warum erhalte ich die Fehlermeldung „HIVE_BAD_DATA: Fehler beim Parsen des Feldwerts '' für Feld X: Für Eingabezeichenfolge: „““, 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: Fehler beim Parsen des Feldwerts für Feld X: Für Eingabezeichenfolge: "12312845691"“ oder „HIVE_BAD_DATA: Fehler beim Parsen der Spalte „0“: Zielmaßstab muss größer als Quellmaßstab sein.“

Kurzbeschreibung

Es gibt mehrere Versionen des HIVE_BAD_DATA-Fehlers. 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 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 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:

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. Zum Beispiel können Sie eine Zeichenfolge in eine Ganzzahl umwandeln. Abhängig von den Datentypen, von denen und in die Sie umwandeln, 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 ausgegeben:

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 verschiedener 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 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:

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 dieid-Spalte als BIGINT, das den Wert „49612833315“ lesen kann. Weitere Informationen finden Sie unter Integer types.

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:

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 einem Jahr