嵌套数据限制(预览版) - Amazon Redshift

嵌套数据限制(预览版)

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

注意

以下列表中标记的限制(预览版)仅适用于在以下区域创建的预览集群和预览工作组。

  • 美国东部(俄亥俄州)(us-east-2)

  • 美国东部(弗吉尼亚州北部)(us-east-1)

  • 美国西部(北加利福尼亚)(us-west-1)

  • 亚太地区(东京)(ap-northeast-1)

  • 欧洲地区(爱尔兰)(eu-west-1)

  • 欧洲地区(斯德哥尔摩)(eu-north-1)

有关设置预览版集群的信息,请参阅《Amazon Redshift 管理指南》中的创建预览版集群。有关设置预览工作组的信息,请参阅《Amazon Redshift 管理指南》中的创建预览工作组

以下限制适用于嵌套数据:

  • arraymap 类型可以包含其他 arraymap 类型,前提是对嵌套 arraysmaps 的查询不返回 scalar 值。(预览版)

  • Amazon Redshift Spectrum 只支持将复杂数据类型用作外部表。

  • 子查询结果列必须是顶级列。(预览版)

  • 如果 OUTER JOIN 表达式引用嵌套表,则它只能引用该表及其嵌套数组(和映射)。如果 OUTER JOIN 表达式不引用嵌套表,它可以引用任何数量的非嵌套表。

  • 如果子查询中的 FROM 子句引用一个嵌套表,则它无法引用任何其他表。

  • 如果子查询依赖于引用父表的嵌套表,那么子查询只能在 FROM 子句中使用父表。您无法在任何其他子句中使用此父项,如 SELECTWHERE 子句。例如,以下查询无法运行,因为子查询的 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 子句之外的任何位置访问嵌套数据的子查询必须返回单个值。唯一的例外是 WHERE 子句中的 (NOT) EXISTS 运算符。

  • 不支持 (NOT) IN

  • 所有嵌套类型的最大嵌套深度均为 100。该限制适用于所有文件格式(Parquet、ORC、Ion 和 JSON)。

  • 访问嵌套数据的聚合子查询只能引用 FROM 子句中的 arraysmaps,而不能引用外部表。

  • 不支持查询 Redshift Spectrum 表中嵌套数据的伪列。有关更多信息,请参阅 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 语句中使用索引。