Amazon Redshift non supporterà più la creazione di nuove UDF Python a partire dal 1º novembre 2025. Se desideri utilizzare le UDF Python, creale prima di tale data. Le UDF Python esistenti continueranno a funzionare normalmente. Per ulteriori informazioni, consulta il post del blog
Esempi di utilizzo dei dati semistrutturati in Amazon Redshift
Gli esempi seguenti mostrano come utilizzare i dati semistrutturati in Amazon Redshift secondo la sintassi PartiQL. Crea una tabella di esempio per caricare un set di dati semistrutturati di esempio, quindi esegui query su oggetti di dati semistrutturati in una varietà di casi d’uso.
Nota
Consigliamo di impostare le opzioni di configurazione enable_case_sensitive_identifier e enable_case_sensitive_super_attribute prima di utilizzare il tipo di dati SUPER. Per ulteriori informazioni, consulta enable_case_sensitive_identifier e enable_case_sensitive_super_attribute.
Caricamento di dati semistrutturati
Le seguenti istruzioni creano una tabella di esempio e caricano un oggetto JSON di esempio nella colonna SUPER all_data.
DROP TABLE IF EXISTS test_json; SET enable_case_sensitive_super_attribute TO true; SET enable_case_sensitive_identifier TO true; CREATE TABLE test_json (all_data SUPER); INSERT INTO test_json VALUES (JSON_PARSE(' { "data":{ "pnr":{ "type":"pnr", "pnrid":"123PQRS-2024-09-20", "bookingIdentifier":"123PQRS", "version":"5", "triggerType":"", "events":[ { "eventType":"UPDATED", "type":"PART", "id":"123PQRS-2024-09-20-HO-1" }, { "eventType":"CREATED", "type":"ABC", "id":"123PQRS-2024-09-20-OT-38" } ], "create":{ "pnrCreateDate":"2024-09-20T16:56:00Z", "officeID":"OFFCID1234", "officeIDCategory":"Email" }, "lastModification":{ "dateTime":"2024-09-20T17:09:00Z" }, "PARTDetails":[ { "path":"1", "TrainPARTs":[ { "PARTID":"123PQRS-2024-09-20-HO-1", "departure":{ "departureStation":"XYZ", "departureTimeLocal":"2024-10-03T06:30:00", "departureTimeGMT":"2024-10-03T10:30:00Z" }, "arrival":{ "arrivalStation":"ABC", "arrivalTimeLocal":"2024-10-03T08:20:00", "arrivalTimeGMT":"2024-10-03T15:20:00Z" }, "marketing":{ "carrierCode":"XX", "TrainNumber":"100" }, "operating":{ "carrierCode":"YY", "TrainNumber":"100-A" }, "status":"ON", "aircraft":{ "code":"222" }, "class":"WC", "first":"Y", "seating":[ ] } ] } ], "commuterInformation":[ { "commuterID":"2", "commuterPNR":"123PQRS-2024-09-20-RO-2", "commuterTypeCode":"DOM", "firstName":"JOHN", "lastName":"MILLER" } ], "contactDetail":[ { "emailContacts":[ { "id":"123PQRS-2024-09-20-OT-4", "contact":"JOHNMILLER@EXAMPLE.COM", "purpose":[ "BUSINESS" ], "commuter":[ "123PQRS-2024-09-20-RO-2" ], "language":"EN" }, { "id":"123PQRS-2024-09-20-OT-5", "contact":"HARVEYCORMIER@EXAMPLE.COM", "purpose":[ "NOTIFICATION" ], "commuter":[ "123PQRS-2024-09-20-RO-2" ], "language":"EN" } ] }, { "phoneContacts":[ { "id":"123PQRS-2024-09-20-OT-3", "contact":"1234567890", "purpose":[ "NOTIFICATION" ], "commuter":[ "123PQRS-2024-09-20-RO-2" ], "language":"" } ] }, { "addressInfo":[ { "id":"123PQRS-2024-09-20-OT-6", "addressline":[ "112 PORT STREET" ], "provinceState":"CA", "cityName":"SAN JOSE", "postalCode":"12345", "countryCode":"USA", "purpose":[ "MAILING" ], "commuter":[ "123PQRS-2024-09-20-RO-2" ] } ] } ], "PendingService":[ { "id":"123PQRS-2024-09-20-OT-26", "code":"MONO", "status":"", "text":"Broken Seat at Coach-No XYZ123 Seat-No 567", "trainCode":"WC-1", "TrainsArray":[ "123PQRS-2024-09-20-HO-1" ], "commuter":[ "123PQRS-2024-09-20-RO-2" ] }, { "id":"123PQRS-2024-09-20-OT-27", "code":"OTHS", "status":"", "text":"Broken Seat at Coach-No XYZ567 Seat-No 111", "trainCode":"WC-1", "TrainsArray":[ "123PQRS-2024-09-20-HO-1" ], "commuter":[ "123PQRS-2024-09-20-RO-2" ] }, { "id":"123PQRS-2024-09-20-OT-28", "code":"OTHS", "status":"", "text":"Broken Seat at Coach-No XYZ890 Seat-No 123", "trainCode":"WC-1", "TrainsArray":[ "123PQRS-2024-09-20-HO-1" ], "commuter":[ "123PQRS-2024-09-20-RO-2" ] }, { "id":"123PQRS-2024-09-20-OT-29", "code":"OTHS", "status":"", "text":"Broken Seat at Coach-No XYZ111 Seat-No 333", "trainCode":"WC-1", "TrainsArray":[ "123PQRS-2024-09-20-HO-1" ], "commuter":[ "123PQRS-2024-09-20-RO-2" ] } ], "parts": [ { "partname": "prop", "manufacturer": "local parts co", "quality": 2, "price": 10.00 }, { "partname": "prop", "manufacturer": "big parts co", "quality": null, "price": 9.00 }, { "partname": "prop", "manufacturer": "small parts co", "quality": 1, "price": 12.00 }, { "partname": "rudder", "manufacturer": "local parts co", "quality": 1, "price": 2.50 }, { "partname": "rudder", "manufacturer": "big parts co", "quality": 2, "price": 3.75 }, { "partname": "rudder", "manufacturer": "small parts co", "quality": null, "price": 1.90 }, { "partname": "wing", "manufacturer": "local parts co", "quality": null, "price": 7.50 }, { "partname": "wing", "manufacturer": "big parts co", "quality": 1, "price": 15.20 }, { "partname": "wing", "manufacturer": "small parts co", "quality": null, "price": 11.80 } ], "count_by_color": [ { "quality": "high", "red": 15, "green": 20, "blue": 7 }, { "quality": "normal", "red": 35, "green": null, "blue": 40 }, { "quality": "low", "red": 10, "green": 23, "blue": null } ] } }, "id":"abcdefgh-ijklmnop-qrstuvwxyz123", "mainIds":[ { "ID":"pqrstuvwxyz-aabbcc123", "Source":"NYC" } ] } '));
Esecuzione di query sui dati semistrutturati annidati
L’istruzione seguente utilizza la notazione con punti di PartiQL per estrarre il campo pnrid, che è annidato a tre livelli di profondità all’interno dell’oggetto all_data di primo livello.
select all_data.data.pnr.pnrid::varchar from test_json;pnrid -------------------- 123PQRS-2024-09-20
L’istruzione seguente utilizza la notazione con parentesi di PartiQL per specificare ed estrarre solo il primo elemento dall’array events annidato all’interno dell’oggetto di primo livello.
SELECT all_data.data.pnr.events[0] FROM test_json;events --------------------------------- { "eventType":"UPDATED", "type":"PART", "id":"123PQRS-2024-09-20-HO-1" }
L’istruzione seguente estrae la proprietà eventType del solo elemento specificato dell’array events.
SELECT all_data.data.pnr.events[0].eventType FROM test_json;eventtype ----------- "UPDATED"
Le istruzioni seguenti
Utilizzo di enable_case_sensitive_identifier e enable_case_sensitive_super_attribute con i dati semistrutturati
Gli esempi seguenti mostrano in che modo le opzioni di configurazione enable_case_sensitive_identifier e enable_case_sensitive_super_attribute differiscono tra loro quando vengono utilizzate per l’esecuzione di query sui dati semistrutturati. Per ulteriori informazioni su queste opzioni di configurazione, consulta Accesso ai campi JSON con nomi di campi o attributi in maiuscolo e in lettere maiuscole e minuscole.
Nell’istruzione seguente, la reimpostazione di entrambe le opzioni di configurazione sul valore predefinito false fa sì che la query restituisca NULL.
RESET enable_case_sensitive_identifier; RESET enable_case_sensitive_super_attribute; SELECT all_data.data.pnr.events[0].eventType FROM test_json;eventtype ----------- NULL
Nell’esempio seguente, la query di esempio restituisce il risultato desiderato dopo che hai racchiuso gli attributi con distinzione tra maiuscole e minuscole tra virgolette doppie e impostato enable_case_sensitive_identifier su true.
RESET enable_case_sensitive_identifier; RESET enable_case_sensitive_super_attribute; SELECT all_data.data.pnr.events[0]."eventType" FROM test_json;eventtype ----------- NULLSET enable_case_sensitive_identifier TO true; SELECT all_data.data.pnr.events[0]."eventType" FROM test_json;eventtype ----------- "UPDATED"
Nell’esempio seguente, la query di esempio restituisce il risultato desiderato dopo che hai impostato enable_case_sensitive_super_attribute su true senza racchiudere gli attributi con distinzione tra maiuscole e minuscole tra virgolette doppie.
RESET enable_case_sensitive_identifier; RESET enable_case_sensitive_super_attribute; SELECT all_data.data.pnr.events[0].eventType FROM test_json;eventtype ----------- NULLSET enable_case_sensitive_super_attribute TO true; SELECT all_data.data.pnr.events[0].eventType FROM test_json;eventtype ----------- "UPDATED"
Filtraggio di dati semistrutturati
L’istruzione seguente utilizza la sintassi PartiQL nella clausola WHERE di un’istruzione che conta gli eventi del tipo UPDATED per recuperare i dati di un determinato attributo dall’interno di un array. Puoi utilizzare questa sintassi in qualsiasi parte della query in cui normalmente faresti riferimento alle colonne.
SELECT COUNT(*) FROM test_json WHERE all_data.data.pnr.events[0].eventType = 'UPDATED';count ------ 1
Nell’esempio seguente viene utilizzata la sintassi con parentesi e punti di PartiQL nelle clausole GROUP BY e ORDER BY.
SELECT all_data.data.pnr.events[0].eventType::varchar, COUNT(*) FROM test_json WHERE all_data.data.pnr.events[0].eventType IS NOT NULL GROUP BY all_data.data.pnr.events[0].eventType ORDER BY all_data.data.pnr.events[0].eventType;eventtype | count -----------+------- "UPDATED" | 1
Annullamento dell’annidamento di dati semistrutturati
L’istruzione seguente utilizza i join PartiQL per annullare l’annidamento dell’array events. Tieni presente che questo join funziona anche quando il numero di indici per l’array non è statico.
Per esempi di annullamento dell’annidamento di dati semistrutturati con UNNEST nella clausola FROM, consulta Esempi di UNNEST.
SELECT a.all_data.data.pnr.type::varchar type_info, a.all_data.data.pnr.pnrid::varchar pnr_id , a.all_data.data.pnr.bookingIdentifier::varchar booking_id, a.all_data.data.pnr.version::varchar version_info, b.eventType::varchar event_type, b.id::varchar event_id FROM test_json a, a.all_data.data.pnr.events b;type_info | pnr_id | booking_id | version_info | event_type | event_id -----------+---------------------+------------+--------------+------------+------------------------- pnr | 123PQRS-2024-09-20 | 123PQRS | 5 | UPDATED | 123PQRS-2024-09-20-HO-1 pnr | 123PQRS-2024-09-20 | 123PQRS | 5 | CREATED | 123PQRS-2024-09-20-OT-38
Annullamento dell’annidamento di array annidati
L’istruzione seguente utilizza i join PartiQL per annullare l’annidamento di un array annidato all’interno di un altro array.
Per esempi di annullamento dell’annidamento di dati semistrutturati con UNNEST nella clausola FROM, consulta Esempi di UNNEST.
SELECT a.all_data.data.pnr.type::varchar type_info, a.all_data.data.pnr.pnrid::varchar pnr_id , a.all_data.data.pnr.bookingIdentifier::varchar booking_id, a.all_data.data.pnr.version::varchar version_info, d.id::varchar email_record_id, d.contact::varchar email_contact, e::varchar email_purpose, f::varchar email_commuter FROM test_json a, a.all_data.data.pnr.contactDetail c, c."emailContacts" d, d.purpose e, d.commuter f;type_info | pnr_id | booking_id | version_info | email_record_id | email_contact | email_purpose | email_commuter -----------+---------------------+------------+--------------+-------------------------+---------------------------+---------------+------------------------- pnr | 123PQRS-2024-09-20 | 123PQRS | 5 | 123PQRS-2024-09-20-OT-4 | JOHNMILLER@EXAMPLE.COM | BUSINESS | 123PQRS-2024-09-20-RO-2 pnr | 123PQRS-2024-09-20 | 123PQRS | 5 | 123PQRS-2024-09-20-OT-5 | HARVEYCORMIER@EXAMPLE.COM | NOTIFICATION | 123PQRS-2024-09-20-RO-2
Utilizzo dei dati semistrutturati nelle sottoquery
L’istruzione seguente utilizza una sottoquery nella clausola WHERE per restituire solo una sottosezione dei risultati dell’esempio precedente.
SELECT a.all_data.data.pnr.type::varchar type_info, a.all_data.data.pnr.pnrid::varchar pnr_id , a.all_data.data.pnr.bookingIdentifier::varchar booking_id, a.all_data.data.pnr.version::varchar version_info, d.id::varchar email_record_id, d.contact::varchar email_contact FROM test_json a, a.all_data.data.pnr.contactDetail c, c."emailContacts" d WHERE (SELECT COUNT(*) FROM d.purpose e WHERE e = 'BUSINESS') > 0;type_info | pnr_id | booking_id | version_info | email_record_id | email_contact | email_purpose | email_commuter -----------+---------------------+------------+--------------+-------------------------+---------------------------+---------------+------------------------- pnr | 123PQRS-2024-09-20 | 123PQRS | 5 | 123PQRS-2024-09-20-OT-4 | JOHNMILLER@EXAMPLE.COM | BUSINESS | 123PQRS-2024-09-20-RO-2
Aggregazione delle query con i dati semistrutturati
L’istruzione seguente utilizza la funzione COUNT per aggregare il numero di elementi nell’array PendingService.
SELECT a.all_data.data.pnr.type::varchar type_info, a.all_data.data.pnr.pnrid::varchar pnr_id , a.all_data.data.pnr.bookingIdentifier::varchar booking_id, a.all_data.data.pnr.version::varchar version_info, COUNT(*) AS total_pending_service FROM test_json a, a.all_data.data.pnr.PendingService c GROUP BY 1,2,3,4;type_info | pnr_id | booking_id | version_info | total_pending_service -----------+--------------------+------------+--------------+----------------------- pnr | 123PQRS-2024-09-20 | 123PQRS | 5 | 4
Utilizzo dei dati semistrutturati nelle viste materializzate
L’istruzione seguente utilizza l’istruzione dell’esempio precedente per creare una vista materializzata. La vista materializzata aggiorna automaticamente il numero di servizi in sospeso quando la tabella di base riceve nuovi dati.
CREATE MATERIALIZED VIEW mv_total_pending_service AUTO REFRESH YES AS SELECT a.all_data.data.pnr.type::varchar type_info, a.all_data.data.pnr.pnrid::varchar pnr_id , a.all_data.data.pnr.bookingIdentifier::varchar booking_id, a.all_data.data.pnr.version::varchar version_info, COUNT(*) AS total_pending_service FROM test_json a, a.all_data.data.pnr.PendingService c GROUP BY 1,2,3,4;
Utilizzo di PIVOT e UNPIVOT con i dati semistrutturati
L’istruzione seguente utilizza PIVOT sulla colonna partname per restituire il prezzo medio di ogni parte.
SELECT * FROM ( SELECT c.partname::varchar, c.price FROM test_json a, a.all_data.data.pnr.parts c) PIVOT (AVG(price) for partname IN ('prop', 'rudder', 'wing'));prop | rudder | wing ------------+--------------------+-------- 10.33 | 2.71 | 11.50
Nell'esempio precedente, i risultati vengono trasformati in colonne. L’esempio seguente mostra una query GROUP BY che restituisce i prezzi medi in righe anziché in colonne.
SELECT partname, avg(price) FROM ( SELECT c.partname::varchar, c.price FROM test_json a, a.all_data.data.pnr.parts c) WHERE partname IN ('prop', 'rudder', 'wing') GROUP BY partname;partname | avg ----------+------- prop | 10.33 rudder | 2.71 wing | 11.50
Di seguito è riportato un esempio di PIVOT con manufacturer come colonna implicita.
SELECT * FROM ( SELECT c.quality, c.manufacturer::varchar FROM test_json a, a.all_data.data.pnr.parts c) PIVOT ( count(*) FOR quality IN (1, 2, NULL) );manufacturer | 1 | 2 | null -------------------+----+----+------ local parts co | 1 | 1 | 1 big parts co | 1 | 1 | 1 small parts co | 1 | 0 | 2
Di seguito è riportato un esempio di UNPIVOT per la colonna quality.
SELECT * FROM ( SELECT c.quality as quality FROM test_json a, a.all_data.data.pnr.parts c) UNPIVOT (cnt FOR column_header IN (quality));column_header | cnt -----------------+---- quality | 2 quality | 1 quality | 1 quality | 2 quality | 1