实体化 Flex 表

创建 Flex 表后,您可以更改表结构以将虚拟列提升为实体化(实际)列。如果您的表已经为混合表,您可以更改现有的实际列,并提升其他重要的虚拟列。本节介绍了提升列、添加列、指定约束和声明默认值的一些关键环节。还介绍了加载 Flex 表或混合表与加载列式表相比的一些区别。

将列添加到 Flex 表

将列添加到 Flex 表以提升虚拟列:

  1. 添加名称与虚拟列 (user.name) 相同的实际列:

    => ALTER TABLE darkdata1 ADD COLUMN "user.name" VARCHAR;
    ALTER TABLE
    
  2. 将一些数据加载到表中。

     => COPY darkdata1 FROM '/vertica/flextable/DATA/tweets_12.json' PARSER fjsonparser();
     Rows Loaded
    -------------
              12
    (1 row)
    
  3. 查询实体化列。请注意,加载数据将自动填充列。空行表示没有值或 NULL:

    => SELECT "user.name" FROM darkdata1;
          user.name
    ---------------------
     I'm Toasterâ¥
    
    
     Flu Beach
     seydo shi
    
    
     The End
     Uptown gentleman.
    
     ~G A B R I E L A â¿
     Avita Desai
    
    
     laughing at clouds.
    (12 rows)
    

添加具有默认值的列

将数据批量加载到 Flex 表中一节介绍了默认值的使用情况以及 Vertica 如何在加载过程中对其进行评估。与所有的表一样,使用 COPY 加载数据会忽略所有的列默认值。

  1. 创建具有列定义的 darkdata1 表。以下示例使用的列名称 (talker) 与虚拟列名称不对应。指定带虚拟列名称的默认值。在此示例中,列 talker 的默认值为 ("user.lang")。由于 user.langLONG VARBINARY __raw__ 列中的一个虚拟列,您必须将它的值转换成 VARCHAR 以匹配 talker 列定义:

    => CREATE FLEX TABLE darkdata1(talker VARCHAR default "user.lang"::VARCHAR);
    CREATE TABLE
    
  2. 加载一些 JSON 数据,并指定 __raw__ 列:

    => COPY darkdata1 (__raw__) FROM '/test/vertica/flextable/DATA/tweets_12.json'
       PARSER fjsonparser();
     Rows Loaded
    -------------
              12
    (1 row)
    
  3. 查询 talker 列。请注意,Vertica 之所以使用默认列值 ("user.lang"),是因为您指定了 __raw__。空行表示没有值或 NULL:

    => SELECT "talker" FROM darkdata1;
     talker
    --------
     it
     en
     es
     en
     en
     es
     tr
     en
    (12 rows)
    
  4. 更改表以添加具有已知虚拟列名称 (user.name) 的列,指定键名为默认值(推荐),并将其转换成 VARCHAR:

    => ALTER TABLE darkdata1 ADD COLUMN "user.name" VARCHAR default "user.name"::VARCHAR;
    ALTER TABLE
    
  5. 再次加载数据,这次不带 __raw__

    => COPY darkdata1 FROM '/test/vertica/flextable/DATA/tweets_12.json' PARSER fjsonparser();
    
  6. 查询两个实际列。请注意,talker 没有值,因为您没有指定 __raw__ 列。user.lang 列包含来自 user.name 虚拟列的值:

    => SELECT "talker", "user.name" FROM darkdata1;
     talker |      user.name
    --------+---------------------
            | laughing at clouds.
            | Avita Desai
            | I'm Toasterâ¥
            |
            |
            |
            | Uptown gentleman.
            | ~G A B R I E L A â¿
            | Flu Beach
            |
            | seydo shi
            | The End
    (12 rows)
    
  7. 再次加载数据,这次指定含有 user.name 默认值表达式的 COPY 语句:

    => COPY darkdata1 (__raw__, "user.name" as 'QueenElizabeth'::varchar) FROM
    '/test/vertica/flextable/DATA/tweets_12.json' PARSER fjsonparser();
     Rows Loaded
    -------------
              12
    (1 row)
    
  8. 再次查询。请注意,实际列 talker 具有默认值(您使用了 __raw__)。按照 COPY 中的指定,"user.name" as 'QueenElizabeth' 表达式覆盖了 user.name 的默认列值:

    => SELECT "talker", "user.name" FROM darkdata1;
     talker |   user.name
    --------+----------------
     it     | QueenElizabeth
     en     | QueenElizabeth
     es     | QueenElizabeth
            | QueenElizabeth
            | QueenElizabeth
            | QueenElizabeth
     en     | QueenElizabeth
     en     | QueenElizabeth
     es     | QueenElizabeth
            | QueenElizabeth
     tr     | QueenElizabeth
     en     | QueenElizabeth
    (12 rows)
    

总之,作为 ALTER TABLE...ADD COLUMN 操作的一部分,您可以设置默认列值。实体化列时,默认值应该引用虚拟列的键名(像在 "user.lang" 中一样)。随后加载带 COPY 值表达式的数据,可覆盖列定义的默认值。

更改 raw 列大小

您可以更改您计划创建的 Flex 表 __raw__ 列的默认大小,还可以更改现有 Flex 表的当前大小,或者同时更改上述两项。

要更改新 Flex 表中 __raw__ 列的默认大小,请设置 FlexTableRawSize 配置参数:

=> ALTER DATABASE DEFAULT SET FlexTableRawSize = 120000;

更改配置参数会影响到您在做出此更改后创建的所有 Flex 表。

要更改现有 Flex 表中 _raw_ 列的大小,请使用 ALTER TABLE 语句更改 raw 列的定义:


=> ALTER TABLE tester ALTER COLUMN __raw__ SET DATA TYPE LONG VARBINARY(120000);
ALTER TABLE

更改 Flex 表实际列

您可以对 Flex 表实际列(__raw____identity__)而不能对任何虚拟列做出以下更改:

删除 Flex 表列

关于删除列,有两个注意事项:

  • 您不能删除 Flex 表排序顺序中的最后一列。

  • 如果您尚未创建带任何实际列的 Flex 表或尚未实体化任何列,则您不能删除 __identity__ 列。

更新 Flex 表视图

将新列添加到具有关联视图的 Flex 表时,系统不会更新视图的结果集,即便该视图使用了通配符 (*) 来表示所有表列。要整合新列,您必须重新创建视图