Serialisasi kompleks bersarang JSON - Amazon Redshift

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Serialisasi kompleks bersarang JSON

Topik ini menunjukkan cara membuat serial data bersarang dalam format. JSON Data bersarang adalah data yang berisi bidang bersarang. Bidang bersarang adalah bidang yang disatukan sebagai entitas tunggal, seperti array, struct, atau objek.

Alternatif untuk metode yang ditunjukkan dalam tutorial ini adalah untuk menanyakan kolom koleksi bersarang tingkat atas sebagai serial. JSON Anda dapat menggunakan serialisasi untuk memeriksa, mengonversi, dan menyerap data bersarang seperti Redshift Spectrum. JSON Metode ini didukung untukORC,, IonJSON, dan format Parket. Gunakan parameter konfigurasi sesi json_serialization_enable untuk mengonfigurasi perilaku serialisasi. Saat diatur, tipe JSON data kompleks diserialisasikan ke VARCHAR (65535). Yang bersarang JSON dapat diakses denganJSONfungsi. Untuk informasi selengkapnya, lihat json_serialization_enable.

Misalnya, tanpa pengaturanjson_serialization_enable, kueri berikut yang mengakses kolom bersarang langsung gagal.

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

Pengaturan json_serialization_enable memungkinkan kueri koleksi tingkat atas secara langsung.

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"}

Pertimbangkan item berikut saat membuat serial bersarangJSON.

  • Ketika kolom koleksi diserialisasikan sebagai VARCHAR (65535), subbidang bersarangnya tidak dapat diakses secara langsung sebagai bagian dari sintaks kueri (misalnya, dalam klausa filter). Namun, JSON fungsi dapat digunakan untuk mengakses bersarangJSON.

  • Representasi khusus berikut tidak didukung:

    • ORCserikat

    • ORCpeta dengan tombol tipe kompleks

    • Datagram ion

    • Ion SEXP

  • Stempel waktu dikembalikan sebagai string ISO serial.

  • Kunci peta primitif dipromosikan ke string (misalnya, 1 ke"1").

  • Nilai nol tingkat atas diserialisasikan sebagai. NULLs

  • Jika serialisasi meluap VARCHAR ukuran maksimum 65535, sel diatur ke. NULL

Serialisasi tipe kompleks yang berisi string JSON

Secara default, nilai string yang terkandung dalam koleksi bersarang diserialisasikan sebagai string yang lolosJSON. Melarikan diri mungkin tidak diinginkan ketika string valid. JSON Sebagai gantinya, Anda mungkin ingin menulis subelement bersarang atau bidang yang secara VARCHAR langsung sebagai. JSON Aktifkan perilaku ini dengan json_serialization_parse_nested_strings konfigurasi tingkat sesi. Ketika keduanya json_serialization_enable dan json_serialization_parse_nested_strings disetel, JSON nilai yang valid diserialisasikan sebaris tanpa karakter escape. Ketika nilainya tidak validJSON, nilai tersebut diloloskan seolah-olah nilai json_serialization_parse_nested_strings konfigurasi tidak disetel. Untuk informasi selengkapnya, lihat json_serialization_parse_nested_string.

Misalnya, asumsikan data dari contoh sebelumnya yang terkandung JSON sebagai tipe structs kompleks di bidang name VARCHAR (20):

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

Ketika json_serialization_parse_nested_strings diatur, name kolom diserialisasikan sebagai berikut:

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"}

Alih-alih melarikan diri seperti ini:

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