

 从补丁 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="limitations-super"></a>

借助 Amazon Redshift，您可以使用 SUPER 数据类型来存储和查询 JSON、Avro 或 Ion 等半结构化数据。SUPER 数据类型限制指的是在 Amazon Redshift 中使用该数据类型时的限制和边界。以下各节将详细介绍 SUPER 数据类型的具体限制，如最大大小、嵌套层级以及半结构化数据中支持的数据类型。
+ 不能将 SUPER 列定义为分配键或排序键。
+ 单个 SUPER 对象最多可保存 16 MB 的数据。
+ SUPER 数据类型的数组和结构的最大嵌套深度为 1000。
+ 存储在单个 SUPER 对象中的任意字符串文本的大小限制为 1600 万个字节。
+ 否则，SUPER 对象中的单个值被限制为对应 Amazon Redshift 类型的最大长度。
+ 不能对 SUPER 列执行部分更新或转换操作。
+ 您不能在右联接或完全外连接中使用 SUPER 数据类型及其别名。
+ SUPER 数据类型不支持 XML 作为入站或出站序列化格式。
+ 在引用用于取消嵌套的表变量的子查询（相关或不相关）的 FROM 子句中，查询只能引用其父表而不能引用其他表。
+  不能对由递归公用表表达式 (`WITH RECURSIVE`) 生成的 SUPER 列执行取消嵌套或对象逆透视。有关递归 CTE 的更多信息，请参阅[递归公用表表达式](r_WITH_clause.md#r_WITH_clause-recursive-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 在子查询中不支持易失性函数，例如 RANDOM ( ) 或 TIMEOFDAY ( )，这些子查询使用此类子查询取消嵌套外部表或 IN 函数的左侧 (LHS)。