序列化複雜嵌套 JSON - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

序列化複雜嵌套 JSON

本教程中演示的方法的替代方法是將頂級嵌套集合列查詢為序列化 JSON。您可以使用序列化來檢查、轉換和攝取嵌套數據,以及使用 Redshift 頻譜的 JSON。ORC、JSON、離子格式和實木複合格式支持此方法。使用會話配置參數json_serialization_enable配置序列化行為。設置後,複雜的 JSON 數據類型將序列化為 VARCHAR (65535)。嵌套的 JSON 可以通過JSON 函數。如需詳細資訊,請參閱 啟用 JSON 序列化

例如,在沒有設定json_serialization_enable,則以下訪問嵌套列的查詢會直接失敗。

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

設置json_serialization_enable允許直接查詢頂級集合。

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

序列化巢狀 JSON 時請考量以下項目。

  • 當集合列被序列化為 VARCHAR (65535) 時,不能作為查詢語法的一部分直接訪問其嵌套子字段(例如,在篩選器子句中)。但是,JSON 函數可用於訪問嵌套的 JSON。

  • 不支持以下專門表示形式:

    • ORC 聯盟

    • 具有複雜類型鍵的 ORC 映射

    • Ion 資料報

    • Ion Specp

  • 時間戳作為 ISO 序列化字符串返回。

  • 原始映射鍵被提升為字符串(例如,1"1"

  • 頂級空值序列化為空值。

  • 如果序列化超出最大 VARCHAR 大小 65535,則單元格設置為 NULL。

序列化包含 JSON 字符串的複雜類型

默認情況下,嵌套集閤中包含的字符串值被序列化為轉義 JSON 字符串。當字符串是有效的 JSON 時,轉義可能是不可取的。相反,您可能希望直接以 JSON 形式編寫嵌套子元素或 VARCHAR 的字段。啟用此行為與json_serialization_parse_nested_strings會話級別配置。當兩者json_serialization_enablejson_serialization_parse_nested_strings時,有效的 JSON 值將在不帶轉義字符的情況下進行內嵌序列化。當值不是有效的 JSON 時,它會被轉義,就好像json_serialization_parse_nested_strings配置值未設置。如需詳細資訊,請參閱 JSON_ 序列化 _ 解析 _ 內部 _ 字符串

例如,假定上一個示例中的數據包含 JSON 作為structs中的複雜類型nameVARCHAR (20) 欄位:

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

時機json_serialization_parse_nested_strings設置時,name列被序列化,如下所示:

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

而不是這樣逃脱:

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