结构体

列可以包含用于存储(类型化)属性-值对的结构体。例如,地址列可以使用带有街道地址、城市/州或省和邮政编码字符串的结构体,例如 { "street":"150 Cambridgepark Dr.", "city":"Cambridge MA", "postalcode":"02140"}。(这是一种 Hive 显示格式,而不是字面意思上存储在数据文件中的内容。)结构体字段可以是基元类型或其他复杂类型。

使用 ROW 表达式定义结构体列。在以下示例中,数据包含客户姓名、地址和帐号列,而地址是数据中的结构体。您在 Vertica 中声明的类型必须与加载到其中的数据类型兼容。

=> CREATE TABLE customers (
    name VARCHAR,
    address ROW(street VARCHAR, city VARCHAR, zipcode INT),
    accountID INT);

在 ROW 中,您可以使用与为列指定字段及数据类型相同的语法来指定字段及其数据类型。出于查询目的,Vertica 会将 ROW 视为单个列。

结构体可以包含其他结构体。在以下示例中,员工拥有各种个人信息,包括本身就是结构体的地址。

=> CREATE TABLE employees(
    employeeID INT,
    personal ROW(
      name VARCHAR,
      address ROW(street VARCHAR, city VARCHAR, zipcode INT),
      taxID INT),
    department VARCHAR);

结构体可以包含基元类型、数组或结构体的数组。

=> CREATE TABLE customers(
  name VARCHAR,
  contact ROW(
    street VARCHAR,
    city VARCHAR,
    zipcode INT,
    email ARRAY[VARCHAR]
  ),
  accountid INT );

在定义外部表时,Vertica 要求表的定义与外部数据的架构相匹配。例如,对于上面员工示例中使用的数据,以下定义是错误的:

=> CREATE EXTERNAL TABLE employees(
    employeeID INT,
    personal ROW(
      name VARCHAR,
      address ROW(street VARCHAR, city VARCHAR),
      zipcode INT,
      taxID INT),
    department VARCHAR)
  AS COPY FROM '...' PARQUET;
ERROR 9151: Datatype mismatch [...]

数据包含具有三个字段(街道、城市、邮政编码)的地址结构体,因此外部表也必须使用具有三个字段的 ROW。将 ROW 更改为具有两个字段并将其中一个字段提升为父 ROW 是不匹配的。每个 ROW 都必须匹配,如果结构体嵌套在数据中,则完整的结构必须匹配。

对于原生表,您可以指定要从数据中加载的列,因此您无需使所有列都匹配。对于加载的列,表的定义必须与数据文件中的架构相匹配。

处理 null 值

如果结构体存在但字段值为 null,Vertica 会在 ROW 中将 NULL 作为其值。所有字段均为 null 的结构体将被视为具有 null 字段的 ROW。如果结构体本身为 null,Vertica 会将 ROW 读取为 NULL。

查询

请参阅行(结构)

限制

ROW 列有几个限制:

  • 最大嵌套深度为 100。

  • Vertica 表最多支持 9800 个列和字段。不计算 ROW 本身,只计算其字段。

  • ROW 列不能使用任何约束(例如 NOT NULL)或默认值。

  • ROW 字段不能是 auto_increment 或 setof。

  • ROW 定义必须至少包含一个字段。

  • “Row”是 ROW 定义中的保留关键字,但允许作为表或列的名称。

  • 不能使用 ALTER TABLE...ALTER COLUMN 修改 ROW 列。

  • 包含 ROW 列的表也不能包含标识、自动增量、默认、SET USING 或序列列。