Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
OpenX JSON SerDe
Wie der Hive können Sie den OpenX verwenden JSON SerDe, JSON um Daten zu verarbeitenJSON. Die Daten werden auch als einzeilige Zeichenketten mit JSON -codiertem Text dargestellt, die durch eine neue Zeile getrennt sind. Wie der Hive JSON SerDe erlaubt der OpenX JSON SerDe keine doppelten Schlüssel map
oder struct
Schlüsselnamen.
Überlegungen und Einschränkungen
-
Bei Verwendung von OpenX JSON SerDe können die Anzahl der Ergebnisse und ihre Werte nicht deterministisch sein. Die Ergebnisse können mehr Zeilen als erwartet, weniger Zeilen als erwartet oder unerwartete Nullwerte enthalten, wenn in den zugrunde liegenden Daten keine vorhanden sind. Um dieses Problem zu umgehen, verwenden Sie den Bienenstock JSON SerDe oder schreiben Sie die Daten in ein anderes Dateiformat um.
-
Das SerDe erwartet, dass sich jedes JSON Dokument in einer einzigen Textzeile befindet, ohne dass die Felder im Datensatz durch Zeilenabschlusszeichen voneinander getrennt werden. Wenn der JSON Text ein hübsches Druckformat hat, erhalten Sie möglicherweise eine Fehlermeldung wie
HIVE_ CURSOR _ERROR: Zeile ist kein gültiges JSON Objekt
oderHIVE_ CURSOR _ERROR:: Unerwartet JsonParseException end-of-input: erwartetes Schließzeichen für OBJECT
den Versuch, die Tabelle abzufragen, nachdem Sie sie erstellt haben.Weitere Informationen finden Sie unter JSONDatendateien
in der SerDe OpenX-Dokumentation von. GitHub
Optionale Eigenschaften
Im Gegensatz zum Hive verfügt der OpenX JSON SerDe auch über die folgenden optionalen SerDe Eigenschaften JSON SerDe, die nützlich sein können, um Inkonsistenzen in Daten zu beheben.
- ignore.malformed.json
-
Optional. Wenn diese Option auf gesetzt ist
TRUE
, können Sie fehlerhafte Syntax überspringen. JSON Der Standardwert istFALSE
. - dots.in.keys
-
Optional. Der Standardwert ist
FALSE
. Wenn auf gesetztTRUE
, können die SerDe Punkte in Schlüsselnamen durch Unterstriche ersetzt werden. Wenn der JSON Datensatz beispielsweise einen Schlüssel mit dem Namen enthält, können Sie diese Eigenschaft verwenden"a.b"
, um den Spaltennamen so zu definieren, dass er sich"a_b"
in Athena befindet. Standardmäßig (ohne dies SerDe) erlaubt Athena keine Punkte in Spaltennamen. - case.insensitive
-
Optional. Der Standardwert ist
TRUE
. Wenn diese Option auf gesetzt istTRUE
, werden alle großgeschriebenen Spalten in Kleinbuchstaben SerDe umgewandelt.Verwenden Sie zur Nutzung von Schlüsselnamen unter Beachtung der Groß-/Kleinschreibung in Ihren Daten
WITH SERDEPROPERTIES ("case.insensitive"= FALSE;)
. Geben Sie dann für jeden Schlüssel, der nicht bereits vollständig aus Kleinbuchstaben besteht, ein Mapping vom Spaltennamen zum Eigenschaftsnamen mit der folgenden Syntax an:ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("case.insensitive" = "FALSE", "mapping.userid" = "userId")
Wenn Sie zwei Schlüssel wie
URL
undUrl
haben die gleich sind, wenn sie aus Kleinbuchstaben bestehen, kann ein Fehler wie der folgende auftreten:HIVE_ CURSOR _ERROR: Zeile ist kein gültiges JSON Objekt -JSONException: Doppelter Schlüssel „url“
Um dies zu beheben, setzen Sie die
case.insensitive
-Eigenschaft aufFALSE
und ordnen Sie die Schlüssel verschiedenen Namen zu, wie im folgenden Beispiel gezeigt:ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("case.insensitive" = "FALSE", "mapping.url1" = "URL", "mapping.url2" = "Url")
- Mapping
-
Optional. Ordnet Spaltennamen JSON Schlüsseln zu, die nicht mit den Spaltennamen identisch sind. Der
mapping
Parameter ist nützlich, wenn die JSON Daten Schlüssel enthalten, bei denen es sich um Schlüsselwörter handelt. Wenn Sie beispielsweise einen JSON Schlüssel mit dem Namen habentimestamp
, verwenden Sie die folgende Syntax, um den Schlüssel einer Spalte mit dem Namen zuzuordnents
:ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("mapping.ts" = "timestamp")
Zuordnung verschachtelter Feldnamen mit Doppelpunkten zu Hive-kompatiblen Namen
Wenn Sie über einen Feldnamen mit Doppelpunkten innerhalb eines
struct
verfügen, können Sie diemapping
-Eigenschaft verwenden, um das Feld einem Hive-kompatiblen Namen zuzuordnen. Wenn Ihre Spaltentypdefinitionen beispielsweisemy:struct:field:string
enthalten, können Sie die Definitionmy_struct_field:string
zuordnen, indem Sie den folgenden Eintrag inWITH SERDEPROPERTIES
einfügen:("mapping.my_struct_field" = "my:struct:field")
Im folgenden Beispiel wird die zugehörige
CREATE TABLE
-Anweisung gezeigt.CREATE EXTERNAL TABLE colon_nested_field ( item struct<my_struct_field:string>) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("mapping.my_struct_field" = "my:struct:field")
Beispiel: Werbedaten
In der folgenden DDL Beispielanweisung wird OpenX verwendet JSON SerDe , um eine Tabelle zu erstellen, die auf denselben Beispieldaten für Online-Werbung basiert, die im Beispiel für The Hive JSON SerDe verwendet wurden. Ersetzen Sie in der LOCATION
Klausel myregion
mit der Regionskennung, in der Sie Athena ausführen.
CREATE EXTERNAL TABLE impressions ( requestbegintime string, adid string, impressionId string, referrer string, useragent string, usercookie string, ip string, number string, processid string, browsercokie string, requestendtime string, timers struct< modellookup:string, requesttime:string>, threadid string, hostname string, sessionid string ) PARTITIONED BY (dt string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://amzn-s3-demo-bucket.elasticmapreduce/samples/hive-ads/tables/impressions';
Beispiel: Deserialisieren von Nested JSON
Sie können den verwenden, JSON SerDes um komplexere -kodierte Daten zu analysieren. JSON Dies erfordert die Verwendung von CREATE TABLE
-Anweisungen, die struct
- und array
- Elemente verwenden, um verschachtelte Strukturen darzustellen.
Im folgenden Beispiel wird eine Athena-Tabelle aus JSON Daten mit verschachtelten Strukturen erstellt. Das Beispiel hat die folgende Struktur:
{
"DocId": "AWS",
"User": {
"Id": 1234,
"Username": "carlos_salazar",
"Name": "Carlos",
"ShippingAddress": {
"Address1": "123 Main St.",
"Address2": null,
"City": "Anytown",
"State": "CA"
},
"Orders": [
{
"ItemId": 6789,
"OrderDate": "11/11/2022"
},
{
"ItemId": 4352,
"OrderDate": "12/12/2022"
}
]
}
}
Denken Sie daran, dass OpenX SerDe erwartet, dass sich jeder JSON Datensatz in einer einzigen Textzeile befindet. Wenn sie in Amazon S3 gespeichert sind, sollten sich alle Daten im vorherigen Beispiel in einer einzigen Zeile befinden, etwa so:
{"DocId":"AWS","User":{"Id":1234,"Username":"carlos_salazar","Name":"Carlos","ShippingAddress" ...
In der folgenden CREATE TABLE
Anweisung werden die Datentypen Openx- JsonSerDestruct
und array
collection verwendet, um Objektgruppen für die Beispieldaten zu erstellen.
CREATE external TABLE complex_json ( docid string, `user` struct< id:INT, username:string, name:string, shippingaddress:struct< address1:string, address2:string, city:string, state:string >, orders:array< struct< itemid:INT, orderdate:string > > > ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://amzn-s3-demo-bucket/
myjsondata
/';
Verwenden Sie eine SELECT
Anweisung wie die folgende, um die Tabelle abzufragen.
SELECT user.name as Name, user.shippingaddress.address1 as Address, user.shippingaddress.city as City, o.itemid as Item_ID, o.orderdate as Order_date FROM complex_json, UNNEST(user.orders) as temp_table (o)
Um auf die Datenfelder innerhalb von Strukturen zuzugreifen, verwendet die Beispielabfrage die Punktnotation (z. B.user.name
). Um auf Daten innerhalb eines Arrays von Strukturen zuzugreifen (wie beim orders
Feld), können Sie die UNNEST
Funktion verwenden. Die UNNEST
Funktion reduziert das Array in eine temporäre Tabelle (in diesem Fall aufgerufen). o
Auf diese Weise können Sie die Punktnotation wie bei Strukturen verwenden, um auf die nicht verschachtelten Array-Elemente zuzugreifen (z. B.). o.itemid
Der Nametemp_table
, der im Beispiel zur Veranschaulichung verwendet wird, wird häufig als abgekürzt. t
Die folgende Tabelle zeigt die Abfrageergebnisse.
# | Name | Adresse | Ort | Item_ID | Datum der Bestellung |
---|---|---|---|---|---|
1 | Carlos | 123 Hauptstr. | Anytown | 6789 | 11.11.2022 |
2 | Carlos | 123 Hauptstraße | Anytown | 4352 | 12.12.2022 |