查询 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 数据函数

要确定哪些键值对作为虚拟列存在,请执行以下操作:

  1. 按如下方式调用函数:

    => SELECT compute_flextable_keys('darkdata');
                compute_flextable_keys
    --------------------------------------------------
     Please see public.darkdata_keys for updated keys(1 row)
    
  2. 通过查询 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_atretweet_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 函数执行此操作。