更新 Flex 表视图
创建 Flex 表的同时,还会创建一个该表附带的默认视图。该视图的名称为 Flex 表名称加上下划线 (_view
) 后缀。当您从默认视图执行 select
查询时,Vertica 会提示您运行 Helper 函数 compute_flextable_keys_and_build_view
:
=> \dv dark*
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)
=> SELECT * FROM darkdata_view;
status
-----------------------------------------------------------------------------------------------
Please run compute_flextable_keys_and_build_view() to update this view to reflect real and
virtual columns in the flex table
(1 row)
有两个 Helper 函数可以创建视图:
-
COMPUTE_FLEXTABLE_KEYS_AND_BUILD_VIEW— 除执行与 BUILD_FLEXTABLE_KEYS 相同的功能外,还计算键。另请参阅使用 COMPUTE_FLEXTABLE_KEYS_AND_BUILD_VIEW.
使用 BUILD_FLEXTABLE_VIEW
计算出 Flex 表的键 (计算 Flex 表键) 后,通过一个或多个实参调用此函数。{flextable}_keys 表 key_name
列下的记录将用作视图列以及该键的任何值。如果不存在任何值,则列值为 NULL。
如下所示,无论使用多少参数,调用此函数均将替换现有视图的内容:
如果您不指定 view_name 实参,默认名称将为 Flex 表名称加上 _view
后缀。例如,如果您指定表 darkdata
为此函数的唯一参数,则默认视图的名称为 darkdata_view
。
您不能指定与默认视图 flex_table_view
名称相同的自定义视图名称,除非您先删除默认命名的视图,然后再自行创建具有相同名称的视图。
创建视图时将存储列结构的定义。因此,如果您创建了 Flex 表视图并随后将虚拟列提升为实际列,您必须重新构建视图。查询具有刚提升的实际列的重建 Flex 表视图可产生两个结果。这些结果同时反映来自实际列和映射数据中的虚拟列的值。
处理视图中的 JSON 重复键名
SQL 是不区分大小写的语言,因此名称 TEST
、test
和 TeSt
是完全相同的。JSON 数据区分大小写,因此可以有效包含大小写不同且具有不同值的键名。
当您构建 Flex 表视图时,如果此函数在 {flextable}_keys 表中检测到名称相同但大小写不同的键,此函数将生成警告。例如,对具有重复键名的 Flex 表调用 BUILD_FLEXTABLE_VIEW
或 COMPUTE_FLEXTABLE_KEYS_AND_BUILD_VIEW()
,将生成以下警告:
=> SELECT compute_flextable_keys_and_build_view('dupe');
WARNING 5821: Detected keys sharing the same case-insensitive key name
WARNING 5909: Found and ignored keys with names longer than the maximum column-name length limit
compute_flextable_keys_and_build_view
----------------------------------------------------------------------------------------------
Please see public.dupe_keys for updated keys
The view public.dupe_view is ready for querying
(1 row)
虽然 {flextable}_keys 表可以包含大小写不同的重复键名,但视图不能。使用上述任一 Helper 函数创建 Flex 表视图,会将所有重复键名合并成一个由所有小写字符组成的列名称。该列的所有重复键值均将予以保存。例如,如果一个 Flex 表中存在以下键名:
-
test
-
Test
-
tESt
视图将包括虚拟列 test
,它具有 test
键、Test
键和 tESt
键的值。
注意
本节的示例包含附加的换行符以减少行长度。产品输出可能有所不同。例如,请考虑显示重复 test
键名称的以下查询:
=> \x
Expanded display is on.
dbt=> select * from dupe_keys;
-[ RECORD 1 ]---+--------------------------------------------------------------------------------------------------
key_name | TesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttest
TesttestTesttestTesttestTesttest
frequency | 2
data_type_guess | varchar(20)
-[ RECORD 2 ]---+--------------------------------------------------------------------------------------------------
key_name | TesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttestTesttest
TesttestTesttestTesttestTest12345
frequency | 2
data_type_guess | varchar(20)
-[ RECORD 3 ]---+--------------------------------------------------------------------------------------------------
key_name | test
frequency | 8
data_type_guess | varchar(20)
-[ RECORD 4 ]---+--------------------------------------------------------------------------------------------------
key_name | TEst
frequency | 8
data_type_guess | varchar(20)
-[ RECORD 5 ]---+--------------------------------------------------------------------------------------------------
key_name | TEST
frequency | 8
data_type_guess | varchar(20)
以下查询显示了 dupe
Flex 表 (dupe_view
)。它显示了合并后的 test
和 testtesttest...
虚拟列。test
、Test
和 tESt
虚拟列的所有值均位于 test
列:
=> SELECT * FROM dupe_view;
test | testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
testtesttesttesttesttesttesttest
--------+--------------------------------------------------------------------------------------------------
upper2 |
half4 |
lower1 |
upper1 |
half1 |
half4 |
|
lower1 |
half1 |
upper2 |
|
lower2 |
lower3 |
upper1 |
lower2 |
lower3 |
(16 rows)
创建 Flex 表视图
下面的示例演示了如何从包含 JSON 数据的 Flex 表 darkdata
创建视图 dd_view
。
=> CREATE VIEW dd_view AS SELECT "user.lang"::VARCHAR, "user.name"::VARCHAR FROM darkdata;
CREATE VIEW
查询您指定的键名及其值:
=> SELECT * FROM dd_view;
user.lang | user.name
-----------+---------------------
en | Uptown gentleman.
en | The End
it | laughing at clouds.
es | I'm Toasterâ¥
|
en | ~G A B R I E L A â¿
|
en | Avita Desai
tr | seydo shi
|
|
es | Flu Beach
(12 rows)
此示例演示了如何对原始表和您之前创建的视图 dd_view
调用 build_flextable_view
:
=> SELECT build_flextable_view ('darkdata', 'dd_view');
build_flextable_view
-----------------------------------------------
The view public.dd_view is ready for querying
(1 row)
再次查询该视图。您可以看到,函数用 darkdata_keys
表的内容填充了该视图。接下来,通过 key_name
列和它们的值,审阅结果中的一个代码段:
=> \x
Expanded display is on.
=> SELECT * FROM dd_view;
.
.
.
user.following |
user.friends_count | 791
user.geo_enabled | F
user.id | 164464905
user.id_str | 164464905
user.is_translator | F
user.lang | en
user.listed_count | 4
user.location | Uptown..
user.name | Uptown gentleman.
.
.
.
请注意,创建视图时将存储列结构的定义。如果您在构建视图后将虚拟列提升为实际列,现有的视图定义不会更改。用 SELECT 语句查询此视图(如下所示),将仅返回 __raw__
列中的值:
=> SELECT * FROM myflextable_view;
另请了解,提升虚拟列后重新构建视图,将改变所得的值。未来的查询将同时返回来自实际列和映射数据中的虚拟列的值。
使用 COMPUTE_FLEXTABLE_KEYS_AND_BUILD_VIEW
在一个步骤中,对 Flex 表调用此函数以计算 Flex 表键(请参阅计算 Flex 表键)并创建视图。