借助 Amazon Redshift,您可以使用 SUPER 数据类型来存储和查询 JSON、Avro 或 Ion 等半结构化数据。SUPER 数据类型限制指的是在 Amazon Redshift 中使用该数据类型时的限制和边界。以下各节将详细介绍 SUPER 数据类型的具体限制,如最大大小、嵌套层级以及半结构化数据中支持的数据类型。
不能将 SUPER 列定义为分配键或排序键。
单个 SUPER 对象最多可保存 16 MB 的数据。
SUPER 数据类型的数组和结构的最大嵌套深度为 1000。
SUPER 对象中的单个值被限制为对应 Amazon Redshift 类型的最大长度。例如,加载到 SUPER 的单个字符串值限制为 65535 个字节的最大 VARCHAR 长度。
不能对 SUPER 列执行部分更新或转换操作。
您不能在右联接或完全外连接中使用 SUPER 数据类型及其别名。
SUPER 数据类型不支持 XML 作为入站或出站序列化格式。
在引用用于取消嵌套的表变量的子查询(相关或不相关)的 FROM 子句中,查询只能引用其父表而不能引用其他表。
不能对由递归公用表表达式 (
WITH RECURSIVE
) 生成的 SUPER 列执行取消嵌套或对象逆透视。有关递归 CTE 的更多信息,请参阅递归公用表表达式。转换限制
SUPER 值可以转换为其他数据类型或从其他数据类型进行转换,但存在一些例外情况:
Amazon Redshift 不区分小数位数为 0 的整数和小数。
如果小数位数不为零,则 SUPER 数据类型的行为与其他 Amazon Redshift 数据类型相同,但 Amazon Redshift 会将与 SUPER 相关的错误转换为 null,如以下示例所示。
SELECT 5::bool; bool ------- True (1 row) SELECT 5::decimal::bool; ERROR: cannot cast type numeric to boolean SELECT 5::super::bool; bool ------- True (1 row) SELECT 5.0::bool; ERROR: cannot cast type numeric to boolean SELECT 5.0::super::bool; bool ------- (1 row)
Amazon Redshift 不会将日期和时间类型转换为 SUPER 数据类型。Amazon Redshift 只能从超级数据类型转换日期和时间数据类型,如以下示例所示。
SELECT o.o_orderdate FROM customer_orders_lineitem c,c.c_orders o; order_date ------------------ "2001-09-08" (1 row) SELECT JSON_TYPEOF(o.o_orderdate) FROM customer_orders_lineitem c,c.c_orders o; json_typeof ----------------- string (1 row) SELECT o.o_orderdate::date FROM customer_orders_lineitem c,c.c_orders o; order_date ---------------- 2001-09-08 (1 row) --date/time cannot be cast to super SELECT '2019-09-09'::date::super; ERROR: cannot cast type date to super
从非标量值(对象和数组)转换为字符串将返回 NULL。要正确序列化这些非标量值,请不要转换它们。请改用
json_serialize
来转换非标量值。json_serialize
函数返回一个 varchar。通常,您不需要将非标量值转换为 varchar,因为 Amazon Redshift 会隐式序列化,如以下第一个示例所示。SELECT r_nations FROM region_nations WHERE r_regionkey=300; r_nations ---------------- [1,"abc",null] (1 row) SELECT r_nations::varchar FROM region_nations WHERE r_regionkey=300; r_nations ------------- (1 row) SELECT JSON_SERIALIZE(r_nations) FROM region_nations WHERE r_regionkey=300; json_serialize ----------------- [1,"abc",null] (1 row)
对于不区分大小写的数据库,Amazon Redshift 不支持 SUPER 数据类型。对于不区分大小写的列,Amazon Redshift 不会将它们转换为 SUPER 类型。因此,Amazon Redshift 不支持 SUPER 列与触发转换的不区分大小写的列交互。
Amazon Redshift 在子查询中不支持易失性函数,例如 RANDOM ( ) 或 TIMEOFDAY ( ),这些子查询使用此类子查询取消嵌套外部表或 IN 函数的左侧 (LHS)。