Serializzazione di JSON nidificato complesso - Amazon Redshift

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.

Serializzazione di JSON nidificato complesso

In questo argomento viene illustrato come serializzare i dati annidati in formato JSON. I dati annidati sono dati che contengono campi annidati. I campi annidati sono campi di cui è stato effettuato il join come un’unica entità, quali array, strutture oppure oggetti.

Un'alternativa ai metodi illustrati in questo tutorial consiste nell'eseguire una query sulle colonne di raccolta nidificate di primo livello come JSON serializzato. È possibile utilizzare la serializzazione per ispezionare, convertire e importare dati nidificati come JSON con Redshift Spectrum. Questo metodo è supportato per i formati ORC, JSON, Ion e Parquet. Utilizzare il parametro di configurazione della sessione json_serialization_enable per configurare il comportamento di serializzazione. Se impostato, i tipi di dati JSON complessi sono serializzati in VARCHAR(65535). È possibile accedere al JSON nidificato con Funzioni JSON. Per ulteriori informazioni, consultare json_serialization_enable.

Ad esempio, senza impostare json_serialization_enable, le seguenti query che accedono direttamente alle colonne nidificate avranno esito negativo.

SELECT * FROM spectrum.customers LIMIT 1; => ERROR: Nested tables do not support '*' in the SELECT clause. SELECT name FROM spectrum.customers LIMIT 1; => ERROR: column "name" does not exist in customers

L'impostazione di json_serialization_enable consente di eseguire le query direttamente sulle raccolte di primo livello.

SET json_serialization_enable TO true; SELECT * FROM spectrum.customers order by id LIMIT 1; id | name | phones | orders ---+--------------------------------------+----------------+---------------------------------------------------------------------------------------------------------------------- 1 | {"given": "John", "family": "Smith"} | ["123-457789"] | [{"shipdate": "2018-03-01T11:59:59.000Z", "price": 100.50}, {"shipdate": "2018-03-01T09:10:00.000Z", "price": 99.12}] SELECT name FROM spectrum.customers order by id LIMIT 1; name --------- {"given": "John", "family": "Smith"}

Considerare quanto segue durante la serializzazione del JSON nidificato.

  • Quando le colonne di raccolta sono serializzate come VARCHAR(65535), non è possibile accedere direttamente ai relativi sottocampi nidificati come parte della sintassi della query (ad esempio, nella clausola filter). Tuttavia, le funzioni JSON possono essere utilizzate per accedere al JSON nidificato.

  • Le seguenti rappresentazioni specializzate non sono supportate:

    • Unioni ORC

    • Mappe ORC con chiavi di tipo complesso

    • Datagrammi Ion

    • SEXP Ion

  • I timestamp vengono restituiti come stringhe serializzate ISO.

  • Le chiavi delle mappe primitive sono promosse a stringa (ad esempio, da 1 a "1").

  • I valori nulli di primo livello vengono serializzati come NULL.

  • Se la serializzazione eccede la dimensione massima VARCHAR di 65535, la cella viene impostata su NULL.

Serializzazione di tipi complessi contenenti stringhe JSON

Per impostazione predefinita, i valori stringa contenuti nelle raccolte nidificate vengono serializzati come stringhe JSON con escape. L'escape potrebbe essere indesiderato se le stringhe sono JSON valide. È invece possibile voler scrivere sottoelementi o campi nidificati che sono VARCHAR direttamente come JSON. Abilitare questo comportamento con la configurazione a livello di sessione json_serialization_parse_nested_strings. Quando sono impostati sia json_serialization_enable che json_serialization_parse_nested_strings, i valori JSON validi sono serializzati in linea senza caratteri escape. Se il valore non è JSON valido, viene eseguito l'escape come se il valore di configurazione json_serialization_parse_nested_strings non fosse impostato. Per ulteriori informazioni, consultare json_serialization_parse_nested_strings.

Ad esempio, si supponga che i dati dell'esempio precedente contengano JSON come tipo complesso structsnel campo name VARCHAR(20):

name --------- {"given": "{\"first\":\"John\",\"middle\":\"James\"}", "family": "Smith"}

Quando è impostato json_serialization_parse_nested_strings, la colonna name viene serializzata come segue:

SET json_serialization_enable TO true; SET json_serialization_parse_nested_strings TO true; SELECT name FROM spectrum.customers order by id LIMIT 1; name --------- {"given": {"first":"John","middle":"James"}, "family": "Smith"}

Anziché essere sottoposto a escape in questo modo:

SET json_serialization_enable TO true; SELECT name FROM spectrum.customers order by id LIMIT 1; name --------- {"given": "{\"first\":\"John\",\"middle\":\"James\"}", "family": "Smith"}