

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://www.amazonaws.cn/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 嵌套数据限制（预览版）
<a name="nested-data-restrictions"></a>

本主题介绍使用 Redshift Spectrum 读取嵌套数据的限制。嵌套数据是包含嵌套字段的数据。嵌套字段是指联接在一起作为单个实体的字段，例如数组、结构或对象。

**注意**  
以下列表中标记的限制（预览版）仅适用于在以下区域中创建的预览集群。  
美国东部（俄亥俄州）(us-east-2)
美国东部（弗吉尼亚州北部）(us-east-1)
美国西部（北加利福尼亚）(us-west-1)
亚太地区（东京）(ap-northeast-1)
欧洲地区（爱尔兰）(eu-west-1)
欧洲地区（斯德哥尔摩）(eu-north-1)
有关设置预览版集群的信息，请参阅《Amazon Redshift 管理指南》**中的[创建预览版集群](https://docs.amazonaws.cn/redshift/latest/mgmt/managing-clusters-console.html#cluster-preview)。

以下限制适用于嵌套数据：
+ `array` 或 `map` 类型可以包含其他 `array` 或 `map` 类型，前提是对嵌套 `arrays` 或 `maps` 的查询不返回 `scalar` 值。（预览版） 
+ Amazon Redshift Spectrum 只支持将复杂数据类型用作外部表。
+  子查询结果列必须是顶级列。（预览版）
+ 如果 `OUTER JOIN` 表达式引用嵌套表，则它只能引用该表及其嵌套数组（和映射）。如果 `OUTER JOIN` 表达式不引用嵌套表，它可以引用任何数量的非嵌套表。
+ 如果子查询中的 `FROM` 子句引用一个嵌套表，则它无法引用任何其他表。
+ 如果子查询依赖于引用父表的嵌套表，那么子查询只能在 `FROM` 子句中使用父表。您无法在任何其他子句中使用此父项，如 `SELECT` 或 `WHERE` 子句。例如，以下查询无法运行，因为子查询的 `SELECT` 子句引用父表 `c`。

  ```
  SELECT c.name.given 
  FROM   spectrum.customers c 
  WHERE (SELECT COUNT(c.id) FROM c.phones p WHERE p LIKE '858%') > 1;
  ```

  以下查询之所以有效，是因为只在子查询的 `FROM` 子句中使用了父 `c`。

  ```
  SELECT c.name.given 
  FROM   spectrum.customers c 
  WHERE (SELECT COUNT(*) FROM c.phones p WHERE p LIKE '858%') > 1;
  ```
+ 在 `FROM` 子句之外的任何位置访问嵌套数据的子查询必须返回单个值。唯一的例外是 `(NOT) EXISTS` 子句中的 `WHERE` 运算符。
+ `(NOT) IN`不支持 。
+ 所有嵌套类型的最大嵌套深度均为 100。该限制适用于所有文件格式（Parquet、ORC、Ion 和 JSON）。
+ 访问嵌套数据的聚合子查询只能引用 `arrays` 子句中的 `maps` 和 `FROM`，而不能引用外部表。
+ 不支持查询 Redshift Spectrum 表中嵌套数据的伪列。有关更多信息，请参阅 [Pseudocolumns](c-spectrum-external-tables.md#c-spectrum-external-tables-pseudocolumns)。
+ 通过在 `FROM` 子句中指定数组列或映射列来提取这些列中的数据时，如果值为 `scalar`，则只能从这些列中选择值。例如，以下查询都尝试从数组内部 `SELECT` 元素。选择 `arr.a` 的查询之所以起作用，是因为 `arr.a` 是一个 `scalar` 值。第二个查询不起作用，因为 `array` 是从 `FROM` 子句中的 `s3.nested table` 提取的数组。（预览版）

  ```
  SELECT array_column FROM s3.nested_table;
  
  array_column
  -----------------
  [{"a":1},{"b":2}]
                          
  SELECT arr.a FROM s3.nested_table t, t.array_column arr;
  
  arr.a
  -----
  1
  
  --This query fails to run.
  SELECT array FROM s3.nested_table tab, tab.array_column array;
  ```

  不能在 `FROM` 子句中使用本身来自另一个数组或映射的数组或映射。要选择嵌套在其他数组中的数组或其他复杂结构，请考虑在 `SELECT` 语句中使用索引。