Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
OpenX JSON SerDe
Come Hive JSON SerDe, puoi usare JSON OpenX per JSON elaborare i dati. I dati sono anche rappresentati come stringhe a riga singola di testo con JSON codifica separate da una nuova riga. Come l'Hive JSON SerDe, l'JSON SerDe OpenX non consente la duplicazione di chiavi o nomi di chiavimap
. struct
Considerazioni e limitazioni
-
Quando si utilizza OpenX JSON SerDe, il numero di risultati e i relativi valori possono essere non deterministici. I risultati possono contenere più righe del previsto, meno righe del previsto o valori nulli imprevisti quando non sono presenti nei dati sottostanti. Per risolvere questo problema, usa o riscrivi alveare JSON SerDe i dati in un altro tipo di formato di file.
-
SerDe Si aspetta che ogni JSON documento si trovi su una singola riga di testo senza caratteri di terminazione di riga che separano i campi del record. Se il JSON testo è in un bel formato di stampa, potresti ricevere un messaggio di errore come
HIVE_ CURSOR _ERROR: Row is not a valid JSON Object o HIVE _ CURSOR _ERROR:: Unexpected JsonParseException end-of-input: un
indicatore di chiusura previsto per OBJECT
quando tenti di interrogare la tabella dopo averla creata.Per ulteriori informazioni, consulta File di JSON dati
nella SerDe documentazione di OpenX su. GitHub
Proprietà facoltative
A differenza di Hive JSON SerDe, JSON SerDe OpenX ha anche le seguenti proprietà SerDe opzionali che possono essere utili per risolvere le incongruenze nei dati.
- ignore.malformed.json
-
Facoltativo. Se impostato su
TRUE
, consente di ignorare una sintassi non valida. JSON Il valore predefinito èFALSE
. - dots.in.keys
-
Facoltativo. Il valore predefinito è
FALSE
. Se impostato suTRUE
, consente di SerDe sostituire i punti nei nomi dei tasti con caratteri di sottolineatura. Ad esempio, se il JSON set di dati contiene una chiave con il nome"a.b"
, puoi utilizzare questa proprietà per definire il nome della colonna da inserire"a_b"
in Athena. Per impostazione predefinita (senza questa opzione SerDe), Athena non consente l'uso di punti nei nomi delle colonne. - case.insensitive
-
Facoltativo. Il valore predefinito è
TRUE
. Se impostato suTRUE
, SerDe converte tutte le colonne maiuscole in minuscole.Per utilizzare i nomi di chiavi con distinzione tra maiuscole e minuscole nei dati, utilizzare
WITH SERDEPROPERTIES ("case.insensitive"= FALSE;)
. Quindi, per ogni chiave che non è già composta da sole minuscole, fornire un mapping dal nome della colonna al nome della proprietà utilizzando la sintassi seguente:ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("case.insensitive" = "FALSE", "mapping.userid" = "userId")
Se hai due chiavi tipo
URL
eUrl
che sono uguali quando sono in minuscolo, può verificarsi un errore come il seguente:HIVE_ CURSOR _ERROR: La riga non è un JSON oggetto valido -JSONException: Chiave duplicata «url»
Per risolvere questo problema, impostare la proprietà
case.insensitive
suFALSE
e mappare le chiavi a nomi diversi, come nell'esempio seguente:ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("case.insensitive" = "FALSE", "mapping.url1" = "URL", "mapping.url2" = "Url")
- mappatura
-
Facoltativo. Associa i nomi delle colonne a JSON chiavi che non sono identiche ai nomi delle colonne. Il
mapping
parametro è utile quando i JSON dati contengono chiavi che sono parole chiave. Ad esempio, se hai una JSON chiave denominatatimestamp
, usa la seguente sintassi per mappare la chiave a una colonna denominatats
:ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("mapping.ts" = "timestamp")
Mappatura dei nomi dei campi annidati con due punti a nomi compatibili con Hive
Se hai il nome di un campo con due punti all'interno di uno
struct
, puoi utilizzare la proprietàmapping
per mappare il campo a un nome compatibile con Hive. Ad esempio, se le definizioni dei tipi di colonna contengonomy:struct:field:string
, puoi mappare la definizione amy_struct_field:string
includendo la seguente voce inWITH SERDEPROPERTIES
:("mapping.my_struct_field" = "my:struct:field")
L'esempio seguente mostra l'istruzione
CREATE TABLE
corrispondente.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")
Esempio: dati pubblicitari
L'DDListruzione di esempio seguente utilizza OpenX JSON SerDe per creare una tabella basata sugli stessi dati pubblicitari online di esempio utilizzati nell'esempio per Hive. JSON SerDe Nella LOCATION
clausola, sostituisci myregion
con l'identificatore della regione in cui esegui Athena.
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';
Esempio: deserializzazione di nested JSON
È possibile utilizzare il JSON SerDes per analizzare dati con codifica più complessi. JSON Ciò richiede l'utilizzo di istruzioni CREATE TABLE
che utilizzino elementi struct
e array
per rappresentare strutture nidificate.
L'esempio seguente crea una tabella Athena da JSON dati con strutture annidate. L'esempio ha la seguente struttura:
{
"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"
}
]
}
}
Ricorda che OpenX SerDe si aspetta che ogni JSON record sia su una singola riga di testo. Se archiviati in Amazon S3, tutti i dati dell'esempio precedente devono trovarsi su un'unica riga, in questo modo:
{"DocId":"AWS","User":{"Id":1234,"Username":"carlos_salazar","Name":"Carlos","ShippingAddress" ...
L'CREATE TABLE
istruzione seguente utilizza i tipi di dati Openx- JsonSerDestruct
and array
collection per stabilire gruppi di oggetti per i dati di esempio.
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
/';
Per interrogare la tabella, utilizzate un'SELECT
istruzione come la seguente.
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)
Per accedere ai campi di dati all'interno delle strutture, la query di esempio utilizza la notazione a punti (ad esempio,user.name
). Per accedere ai dati all'interno di una matrice di strutture (come nel orders
campo), puoi usare la funzione. UNNEST
La UNNEST
funzione appiattisce l'array in una tabella temporanea (in questo caso chiamata). o
Ciò consente di utilizzare la notazione a punti come si fa con le strutture per accedere agli elementi dell'array non annidati (ad esempio,). o.itemid
Il nometemp_table
, usato nell'esempio a scopo illustrativo, è spesso abbreviato in. t
La tabella seguente mostra i risultati dell'interrogazione.
# | Nome | Indirizzo | City | Item_ID | Data_ordine |
---|---|---|---|---|---|
1 | Carlos | 123 Main St. | Qualsiasi città | 6789 | 11/11/2022 |
2 | Carlos | 123 Main St. | Qualsiasi città | 4352 | 12/12/2022 |