查询 Flex 表
创建 Flex 表(带或不带附加列)并加载数据后,您可以像处理其他表一样使用 SELECT、COPY、TRUNCATE 和 DELETE。您可以将 SELECT 查询用于 Flex 表 __raw__
列中存在的虚拟列以及该表中的其他实际列。__raw__
列中的字段名称不区分大小写,实际列的名称也是如此。
不受支持的 DDL 和 DML 语句
您不能将以下 DDL 和 DML 语句用于 Flex 表:
-
CREATE TABLE...AS...
-
CREATE TABLE...LIKE...
-
SELECT INTO
-
UPDATE
-
MERGE
确定 Flex 表数据的内容
如果您不知道您的 Flex 表包含什么,两个 Helper 函数可让您浏览 VMap 数据以确定内容。使用这些函数计算 Flex 表 __raw__
列中的键,然后可以选择构建基于这些键的视图:
有关这些和其他 Helper 函数的详细信息,请参阅 Flex 数据函数。
要确定哪些键值对作为虚拟列存在,请执行以下操作:
-
按如下方式调用函数:
=> SELECT compute_flextable_keys('darkdata'); compute_flextable_keys -------------------------------------------------- Please see public.darkdata_keys for updated keys(1 row)
-
通过查询
darkdata_keys
表查看键名:=> SELECT * FROM darkdata_keys;
key_name | frequency | data_type_guess -----------------------------------------------------+-----------+------------- contributors | 8 | varchar(20) coordinates | 8 | varchar(20) created_at | 8 | varchar(60) entities.hashtags | 8 | long varbinary(186) . . retweeted_status.user.time_zone | 1 | varchar(20) retweeted_status.user.url | 1 | varchar(68) retweeted_status.user.utc_offset | 1 | varchar(20) retweeted_status.user.verified | 1 | varchar(20) (125 rows)
查询虚拟列
继续采用 JSON 数据示例,使用 SELECT 语句查询浏览虚拟列的内容。然后,分析当您要实体化任何虚拟列时什么对您来说最重要。此示例演示了如何在 VMap 数据中查询一些常用虚拟列:
=> SELECT "user.name", "user.lang", "user.geo_enabled" FROM darkdata1;
user.name | user.lang | user.geo_enabled
---------------------+-----------+------------------
laughing at clouds. | it | T
Avita Desai | en | F
I'm Toaster⥠| es | T
| |
| |
| |
Uptown gentleman. | en | F
~G A B R I E L A â¿ | en | F
Flu Beach | es | F
| |
seydo shi | tr | T
The End | en | F
(12 rows)
查询 Flex 表键
如果您在 Flex 表查询中引用未定义的列 ('which_column'
),Vertica 会按照如下方式将该查询转换成对 MAPLOOKUP 函数的调用:
MAPLOOKUP(__raw__, 'which_column')
MAPLOOKUP 函数在 VMap 数据中搜索所请求的键,并返回以下信息:
-
针对某行与键关联的字符串值。
-
NULL
如果未找到该键。
有关处理 NULL 值的详细信息,请参阅 MAPCONTAINSKEY()。
在 Flex 表查询中使用函数和转换
您可以根据需要转换虚拟列,并在 SELECT 语句查询中使用函数。下一个示例使用 SELECT 语句查询 created_at
和 retweet_count
虚拟列,并在此过程中转换它们的值:
=> SELECT "created_at"::TIMESTAMP, "retweet_count"::INT FROM darkdata1 ORDER BY 1 DESC;
created_at | retweet_count
---------------------+---------------
2012-10-15 14:41:05 | 0
2012-10-15 14:41:05 | 0
2012-10-15 14:41:05 | 0
2012-10-15 14:41:05 | 0
2012-10-15 14:41:05 | 0
2012-10-15 14:41:05 | 0
2012-10-15 14:41:05 | 0
2012-10-15 14:41:04 | 1
|
|
|
|
(12 rows)
以下查询使用 COUNT 和 AVG 函数来确定不同语言的文本的平均长度:
=> SELECT "user.lang", count (*), avg(length("text"))::int FROM darkdata1 GROUP BY 1 ORDER BY 2 DESC;
user.lang | count | avg
-----------+-------+-----
en | 4 | 42
| 4 |
es | 2 | 96
it | 1 | 50
tr | 1 | 16
(5 rows)
在查询中转换数据类型
以下查询请求了 created_at
虚拟列的值,而没有将其转换成特定的数据类型:
=> SELECT "created_at" FROM darkdata1;
created_at
--------------------------------
Mon Oct 15 18:41:04 +0000 2012
Mon Oct 15 18:41:05 +0000 2012
Mon Oct 15 18:41:05 +0000 2012
Mon Oct 15 18:41:05 +0000 2012
Mon Oct 15 18:41:05 +0000 2012
Mon Oct 15 18:41:05 +0000 2012
Mon Oct 15 18:41:05 +0000 2012
Mon Oct 15 18:41:05 +0000 2012
(12 rows)
下一个示例查询了同一虚拟列,并将 created_at
转换成了 TIMESTAMP。转换会导致不同的输出和区域时间:
=> SELECT "created_at"::TIMESTAMP FROM darkdata1 ORDER BY 1 DESC;
created_at
---------------------
2012-10-15 14:41:05
2012-10-15 14:41:05
2012-10-15 14:41:05
2012-10-15 14:41:05
2012-10-15 14:41:05
2012-10-15 14:41:05
2012-10-15 14:41:05
2012-10-15 14:41:04
访问 EPOCH 键
EPOCH(全部为大写字母)一词留供 Vertica 内部使用。
如果您的 JSON 数据包含名为 epoch
的虚拟列,您可以在 Flex 表内查询它。但是,请使用 MAPLOOKUP 函数执行此操作。