实体化 Flex 表
创建 Flex 表后,您可以更改表结构以将虚拟列提升为实体化(实际)列。如果您的表已经为混合表,您可以更改现有的实际列,并提升其他重要的虚拟列。本节介绍了提升列、添加列、指定约束和声明默认值的一些关键环节。还介绍了加载 Flex 表或混合表与加载列式表相比的一些区别。
注意
通过将虚拟列提升为实际列来实现虚拟列的实体化,可以显著提高查询性能。Vertica 建议您先实体化重要的虚拟列,然后再运行大型和复杂的查询。提升后的列可导致加载性能稍有降低。将列添加到 Flex 表
将列添加到 Flex 表以提升虚拟列:
-
添加名称与虚拟列 (
user.name
) 相同的实际列:=> ALTER TABLE darkdata1 ADD COLUMN "user.name" VARCHAR; ALTER TABLE
-
将一些数据加载到表中。
=> COPY darkdata1 FROM '/vertica/flextable/DATA/tweets_12.json' PARSER fjsonparser(); Rows Loaded ------------- 12 (1 row)
-
查询实体化列。请注意,加载数据将自动填充列。空行表示没有值或 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 加载数据会忽略所有的列默认值。
注意
要将表列默认表达式添加到 Flex 表,需要将列转换成显式数据类型。-
创建具有列定义的
darkdata1
表。以下示例使用的列名称 (talker
) 与虚拟列名称不对应。指定带虚拟列名称的默认值。在此示例中,列talker
的默认值为 ("user.lang
")。由于user.lang
是LONG VARBINARY __raw__
列中的一个虚拟列,您必须将它的值转换成VARCHAR
以匹配talker
列定义:=> CREATE FLEX TABLE darkdata1(talker VARCHAR default "user.lang"::VARCHAR); CREATE TABLE
-
加载一些 JSON 数据,并指定
__raw__
列:=> COPY darkdata1 (__raw__) FROM '/test/vertica/flextable/DATA/tweets_12.json' PARSER fjsonparser(); Rows Loaded ------------- 12 (1 row)
-
查询
talker
列。请注意,Vertica 之所以使用默认列值 ("user.lang
"),是因为您指定了__raw__
。空行表示没有值或 NULL:=> SELECT "talker" FROM darkdata1; talker -------- it en es en en es tr en (12 rows)
-
更改表以添加具有已知虚拟列名称 (
user.name
) 的列,指定键名为默认值(推荐),并将其转换成 VARCHAR:=> ALTER TABLE darkdata1 ADD COLUMN "user.name" VARCHAR default "user.name"::VARCHAR; ALTER TABLE
-
再次加载数据,这次不带
__raw__
:=> COPY darkdata1 FROM '/test/vertica/flextable/DATA/tweets_12.json' PARSER fjsonparser();
-
查询两个实际列。请注意,
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)
-
再次加载数据,这次指定含有
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)
-
再次查询。请注意,实际列
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
注意
如果您试图将__raw__
列大小的值减至小于列中包含的任何数据,就会发生错误。
更改 Flex 表实际列
您可以对 Flex 表实际列(__raw__
和 __identity__
)而不能对任何虚拟列做出以下更改:
注意
虽然允许对__raw__
列进行分段和分区,但因为其数据类型长而不建议这样做。默认情况下,如果不定义任何实际列,则 Flex 表将在 __identity__
列上分段。
删除 Flex 表列
关于删除列,有两个注意事项:
-
您不能删除 Flex 表排序顺序中的最后一列。
-
如果您尚未创建带任何实际列的 Flex 表或尚未实体化任何列,则您不能删除
__identity__
列。
更新 Flex 表视图
将新列添加到具有关联视图的 Flex 表时,系统不会更新视图的结果集,即便该视图使用了通配符 (*) 来表示所有表列。要整合新列,您必须重新创建视图。