Warum erhalte ich Fehler, wenn ich versuche, JSON-Daten in Amazon Athena zu lesen?

Lesedauer: 4 Minute
0

Wenn ich versuche, JSON-Daten in Amazon Athena zu lesen, erhalte ich NULL- oder Falsche-Daten-Fehler.

Behebung

Informieren Sie sich über die folgenden häufig auftretenden Probleme:

Verwenden Sie das richtige JSON SerDe

Athena verarbeitet JSON-Daten mithilfe von zwei JSON SerDes:

Wenn Sie sich nicht sicher sind, welches SerDe Sie verwendet haben, probieren Sie beide SerDe-Versionen. Wenn Sie OpenX SerDe verwenden, können Sie falsch formatierte Datensätze ignorieren, um die Zeilen zu identifizieren, die die Fehler verursachen, wie im folgenden Beispiel gezeigt. Wenn ignore.malformed.json auf true gesetzt ist, werden falsch formatierte Datensätze als NULL angezeigt.

CREATE EXTERNAL TABLE json (
    id int,
    name string
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://awsexamplebucket/';

Fragen Sie die neue Tabelle ab, um die Dateien mit falsch formatierten Datensätzen zu identifizieren. Zum Beispiel:

SELECT "$PATH", * FROM your_table where your_column is NULL

Verwenden Sie eine Zeile pro Datensatz

Die folgenden JSON-Datensätze sind korrekt formatiert:

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

Die folgenden JSON-Datensätze sind falsch formatiert:

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

Diese Datensätze sind ebenfalls falsch formatiert:

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

Verwenden Sie in jeder Spalte den richtigen Datentyp

Die zweite Zeile im folgenden Beispiel enthält einen falschen Datentyp für „Alter“. Der Spaltenwert sollte „11" statt „elf“ sein. Dies führt zu der folgenden Fehlermeldung: HIVE_BAD_DATA: Error parsing field value ‚eleven‘ for field 1: For input string: „eleven“.

{"name":"Patrick","age":35,"address":"North Street"}
{"name":"Carlos","age":"eleven","address":"Flowers Street"}
{"name":"Fabiana","age":22,"address":"Main Street"}

Verwenden Sie die richtige Erweiterung für komprimierte JSON-Dateien

Wenn Sie eine komprimierte JSON-Datei verwenden, muss die Datei auf „.json“ enden, gefolgt von der Erweiterung des Komprimierungsformats, z. B. „.gz“. Dies ist beispielsweise eine korrekt formatierte Erweiterung für eine Gzip-Datei: „myfile.json.gz“.

Verwenden Sie Spalten, bei denen die Groß- und Kleinschreibung nicht beachtet wird, oder setzen Sie die Eigenschaft case.insensitive auf false

Athena unterscheidet standardmäßig nicht zwischen Groß- und Kleinschreibung. Wenn Sie Spaltennamen haben, die sich nur nach Groß- und Kleinschreibung unterscheiden (z. B. „Spalte“ und „spalte“), generiert Athena einen Fehler („HIVE_CURSOR_ERROR: Row is not a valid JSON Object - JSONException: Duplicate key“) und Ihre Daten sind in Athena nicht sichtbar. Der einfachste Weg, dieses Problem zu vermeiden, besteht darin, Ihre Daten mit Spalten zu generieren, bei denen die Groß- und Kleinschreibung nicht beachtet wird.

Wenn Sie OpenX SerDe verwenden, können Sie Schlüsselnamen verwenden, bei denen zwischen Groß- und Kleinschreibung unterschieden wird. Setzen Sie dazu die Eigenschaft case.insensitive von SerDe auf false und fügen Sie eine Zuordnung für den Schlüssel in Großbuchstaben hinzu. Um beispielsweise Spalten in Groß- und Kleinschreibung wie folgt zu verwenden:

{"Username": "bob1234", "username": "bob" }

Verwenden Sie diese SerDe-Eigenschaften:

CREATE external TABLE casesensitive_json (user_name String,username String)
ROW FORMAT serde 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'mapping.user_name' = 'Username','case.insensitive'='false')
LOCATION 's3://awsexamplebucket/';

Stellen Sie sicher, dass alle Zeilen in der JSON-SerDe-Tabelle im JSON-Format vorliegen

Gehen Sie wie folgt vor, um herauszufinden, ob die Athena-Tabelle ungültige JSON-Zeilen oder Dateinamen enthält:

1.Erstellen Sie eine Tabelle mit einem Trennzeichen, das in den Eingabedateien nicht vorhanden ist. Führen Sie einen Befehl ähnlich dem folgenden aus:

CREATE EXTERNAL TABLE IF NOT EXISTS json_validator (jsonrow string) ROW FORMAT DELIMITED
FIELDS TERMINATED BY '%'
location 's3://awsexamplebucket/';

2.Führen Sie eine Abfrage ähnlich der folgenden aus, um den Dateinamen, die Zeilendetails und den Amazon-S3-Pfad für die ungültigen JSON-Zeilen anzuzeigen.

WITH testdataset AS (SELECT "$path" s3path,jsonrow,try(json_parse(jsonrow)) isjson FROM json_validator)
SELECT * FROM testdataset WHERE ISJSON IS NULL;

Ähnliche Informationen

Bewährte Methoden für das Lesen von JSON-Daten

Behebung von JSON-bezogenen Fehlern

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren