Warum erhalte ich Fehler, wenn ich versuche, JSON-Daten in Amazon Athena zu lesen?
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:
- Das native Apache Hive/HCatalog JsonSerDe (org.apache.hive.hcatalog.data.JsonSerDe)
- Das OpenX SerDe (org.openx.data.jsonserde.JsonSerDe)
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
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 9 Monaten
- AWS OFFICIALAktualisiert vor einem Jahr
- AWS OFFICIALAktualisiert vor einem Jahr