了解 Flex 表

非结构化数据一词(有时称为半结构化数据黑暗数据)并不表示您加载到 Flex 表中的数据完全没有结构。但是,您可能不知道数据的构成或其设计的不一致。在某些情况下,数据可能不相关。

您的数据可能具有一些结构(如 JSON 和分隔数据)。数据可能是半结构化或严格结构化的,但其结构却采用您不了解或不期望的方式建立。可变数据一词涵盖了上述和其他类型的数据。您可以将可变数据直接加载到 Flex 表中,然后查询其内容。

总之,您可以在不知道数据结构的情况下先加载数据,然后在经过几次简单的转换后查询其内容。在某些情况下,您已经知道数据结构,比如数据中的一些键。如果是这样,只要加载了数据,您就可以显式查询这些值。

存储 Flex 表数据

虽然您可以将非结构化数据存储在 Flex 表 __raw__ 列中,该列将作为实际列实施。

Vertica 将 __raw__ 列数据压缩至大约一半 (1/2)。虽然此因数小于实际列的压缩率,却可以显著减少大量(1TB 以上)非结构化数据。压缩完成后,Vertica 将数据写入到磁盘。如果节点出现故障,这种方法可在群集中保持 K-safety 并支持标准恢复流程。Flex 表会包含在完整备份中(或者按照您的选择包含在对象级备份中)。

创建 Flex 表时会发生什么?

每当您执行 CREATE FLEX TABLE 语句时,Vertica 都会创建三个对象,如下所示:

  • Flex 表 (flex_table)

  • 相关联的键表 (flex_table_keys)

  • 主表的默认视图 (flex_table_view)

_keys_view 对象为父项 flex_table 的依赖项。删除 Flex 表将同时删除其依赖项,不过您可以单独删除 _keys_view 对象。

您可以在不指定任何列定义的情况下创建 Flex 表。当您这样做时,Vertica 将自动创建两个表,分别为指定的 Flex 表(如 darkdata)和与其相关联的键表 darkdata_keys

=> CREATE flex table darkdata();
CREATE TABLE
=> \dt dark*
                List of tables
 Schema |     Name      | Kind  |  Owner  | Comment
--------+---------------+-------+---------+---------
 public | darkdata      | table | dbadmin |
 public | darkdata_keys | table | dbadmin |
(2 rows)

每个 Flex 表具有两个默认列,分别为 __raw____identity____raw__ 列存在于每个 Flex 表中,旨在存储您加载的数据。__identity__ 列自动递增。如果不存在其他列定义,Vertica 将 __identity__ 列用于分段和排序。Flex 键表包含三列:

=> SELECT * FROM darkdata_keys;
 key_name | frequency | data_type_guess
----------+-----------+-----------------
(0 rows)

如果您在创建 Flex 表时定义列,Vertica 仍会创建 __raw__ 列。但该表没有 __identity__ 列,因为各列被指定用于分段和排序。如以下示例所示,将自动创建两个表:

=> CREATE FLEX TABLE darkdata1 (name VARCHAR);
CREATE TABLE

=> SELECT * FROM darkdata1;
 __raw__ | name
---------+------
(0 rows)

=> \d darkdata1*
                                            List of Fields by Tables
 Schema |   Table   | Column  |          Type          |  Size  | Default | Not Null | Primary Key | Foreign Key
--------+-----------+---------+------------------------+--------+---------+----------+-------------+-------------
 public | darkdata1 | __raw__ | long varbinary(130000) | 130000 |         | t        | f           |
 public | darkdata1 | name    | varchar(80)            |     80 |         | f        | f           |
(2 rows)

=> \dt darkdata1*
                   List of tables
 Schema |      Name      | Kind  |  Owner  | Comment
--------+----------------+-------+---------+---------
 public | darkdata1      | table | dbadmin |
 public | darkdata1_keys | table | dbadmin |
(2 rows)

有关更多示例,请参阅创建 Flex 表

自动创建超投影

除了为各 Flex 表创建两个表以外,Vertica 还为主 Flex 表及其关联键表创建超投影。使用 \dj 命令时,您可以在这组示例中显示自动为 darkdata 表和 darkdata1 表创建的投影:

=> \dj darkdata*
                           List of projections
 Schema |          Name           |  Owner  |       Node       | Comment
--------+-------------------------+---------+------------------+---------
 public | darkdata1_b0            | dbadmin |                  |
 public | darkdata1_b1            | dbadmin |                  |
 public | darkdata1_keys_super    | dbadmin | v_vmart_node0001 |
 public | darkdata1_keys_super    | dbadmin | v_vmart_node0003 |
 public | darkdata1_keys_super    | dbadmin | v_vmart_node0004 |
 public | darkdata_b0             | dbadmin |                  |
 public | darkdata_b1             | dbadmin |                  |
 public | darkdata_keys__super    | dbadmin | v_vmart_node0001 |
 public | darkdata_keys_super     | dbadmin | v_vmart_node0003 |
 public | darkdata_keys_super     | dbadmin | v_vmart_node0004 |
(10 rows)

默认 Flex 表视图

创建 Flex 表时,还将同时创建一个默认视图。此默认视图使用带有 _view 后缀的表名。如果查询默认视图,系统会提示您使用 COMPUTE_FLEXTABLE_KEYS_AND_BUILD_VIEW 函数。此视图可让您在加载数据后更新视图,从而使其包含所有的键和值。

=> \dv darkdata*
                  List of View Fields
 Schema |      View      | Column |     Type     | Size
--------+----------------+--------+--------------+------
 public | darkdata_view  | status | varchar(124) |  124
 public | darkdata1_view | status | varchar(124) |  124
(2 rows)

有关详细信息,请参阅更新 Flex 表视图

Flex 函数

三组函数支持 Flex 表并将数据提取到 VMap 中:

使用带 Flex 表的客户端

您可以按照如下方式将 Vertica 支持的客户端驱动程序与 Flex 表配合使用:

  • 要将数据加载到 Flex 表中,您可以将 INSERTCOPY LOCAL 语句与适当的 Flex 解析器一起使用。

  • 驱动程序元数据 API 仅返回实际列。例如,如果您从具有单个实体化列的 Flex 表中选择 *,则该语句将返回该列和 __raw__。但不会返回 __raw__ 内的虚拟列。要访问虚拟列和它们的值,请查询相关联的 _keys 表,就像您在 vsql 中执行查询一样。