嵌套数据限制(预览版)
本主题介绍使用 Redshift Spectrum 读取嵌套数据的限制。嵌套数据是包含嵌套字段的数据。嵌套字段是指联接在一起作为单个实体的字段,例如数组、结构或对象。
注意
以下限制适用于嵌套数据:
-
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
子句之外的任何位置访问嵌套数据的子查询必须返回单个值。唯一的例外是WHERE
子句中的(NOT) EXISTS
运算符。 -
不支持
(NOT) IN
。 -
所有嵌套类型的最大嵌套深度均为 100。该限制适用于所有文件格式(Parquet、ORC、Ion 和 JSON)。
-
访问嵌套数据的聚合子查询只能引用
FROM
子句中的arrays
和maps
,而不能引用外部表。 -
不支持查询 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
语句中使用索引。