查询外部表

创建外部表后,可以像查询任何其他表一样查询它。假设您创建了以下外部表:

=> CREATE EXTERNAL TABLE catalog (id INT, description VARCHAR, category VARCHAR)
    AS COPY FROM 'hdfs:///dat/catalog.csv' DELIMITER ',';
CREATE TABLE
=> CREATE EXTERNAL TABLE inventory(storeID INT, prodID INT, quantity INT)
    AS COPY FROM 'hdfs:///dat/inventory.csv' DELIMITER ',';
CREATE TABLE

您现在可以针对这些表编写查询,如下所示:

=> SELECT * FROM catalog;
 id |     description      |  category
----+----------------------+-------------
 10 | 24in monitor         | computers
 11 | 27in monitor         | computers
 12 | 24in IPS monitor     | computers
 20 | 1TB USB drive        | computers
 21 | 2TB USB drive        | computers
 22 | 32GB USB thumb drive | computers
 30 | 40in LED TV          | electronics
 31 | 50in LED TV          | electronics
 32 | 60in plasma TV       | electronics
(9 rows)

=> SELECT * FROM inventory;
 storeID | prodID | quantity
---------+--------+----------
     502 |     10 |       17
     502 |     11 |        2
     517 |     10 |        1
     517 |     12 |        2
     517 |     12 |        4
     542 |     10 |        3
     542 |     11 |       11
     542 |     12 |        1
(8 rows)

=> SELECT inventory.storeID,catalog.description,inventory.quantity
    FROM inventory JOIN catalog ON inventory.prodID = catalog.id;
 storeID |   description    | quantity
---------+------------------+----------
     502 | 24in monitor     |       17
     517 | 24in monitor     |        1
     542 | 24in monitor     |        3
     502 | 27in monitor     |        2
     542 | 27in monitor     |       11
     517 | 24in IPS monitor |        2
     517 | 24in IPS monitor |        4
     542 | 24in IPS monitor |        1
(8 rows)

外部表和 Vertica 原生表之间的一个重要区别是,查询外部表每次都会读取外部数据。(请参阅外部表与原生表有何差异。)具体来说,选择查询每次引用外部表时,Vertica 会重新解析 COPY 语句定义以访问数据。在运行查询之前,您的表定义或数据中的某些错误不会很明显,因此请在将外部表部署到生产环境之前测试外部表。

处理错误

使用不正确的 COPY FROM 语句定义查询外部表数据可能会导致多个拒绝行。为了限制拒绝数量,Vertica 使用 ExternalTablesExceptionsLimit 配置参数设置保留的最大拒绝数。默认值为 100。将 ExternalTablesExceptionsLimit 设置为 –1 可移除此限制,但不建议这样做。

如果 COPY 错误达到最大拒绝数,外部表查询会继续,但 COPY 会在 vertica.log 文件中生成一条警告,且不会报告后续拒绝行。

设置拒绝阈值下限时,使用 ExternalTablesExceptionsLimit 配置参数不同于使用 COPY 语句 REJECTMAX 参数。REJECTMAX 值控制在导致加载失败前所允许的拒绝行数量。如果 COPY 遇到等于或大于 REJECTMAX 的拒绝行数,则 COPY 中止执行,而不是在 vertica.log 中记录警告。

提高外部表的查询性能。

如果较小的表是内部表,则包含联接的查询会执行得更好。对于原生表,查询优化器使用基数来选择内部表。对于外部表,查询优化器使用行计数(如果可用)。

创建外部表后,使用 ANALYZE_EXTERNAL_ROW_COUNT 收集此信息。调用此函数可能成本很高,因为它必须实体化表的一列才能计算行数,因此请在数据库不忙于关键查询时进行此分析。(这就是 Vertica 在您创建表时不会自动执行此操作的原因。)

查询优化器在计划查询时使用您最近调用此函数的结果。因此,如果数据量发生显著变化,您应当再次运行它以提供更新的统计信息。几个百分点的差异无关紧要,但如果您的数据量增长了 20% 或更多,则应当在可能的情况下重复此操作。

如果您的数据已分区,Vertica 会自动修剪不会影响查询结果的分区,从而减少加载的数据。

对于使用 Hive 0.14 及更高版本写入的 ORC 和 Parquet 数据,Vertica 自动使用谓词下推以进一步提高查询性能。谓词下推可将部分查询移动到更接近数据的位置执行,从而减少了必须从磁盘或通过网络读取的数据量。使用早期版本的 Hive 写入的 ORC 文件可能不包含执行此优化所需的统计信息。对缺少上述统计信息的文件执行查询时,Vertica 会在 QUERY_EVENTS 系统表中记录一个 EXTERNAL_PREDICATE_PUSHDOWN_NOT_SUPPORTED 事件。如果您发现查询出现性能方面的问题,请检查此表中是否有这些事件。

将外部表与用户定义的加载 (UDL) 函数结合使用

您可以将外部表与自己创建的 UDL 函数结合使用。有关使用 UDL 的详细信息,请参阅用户定义的加载 (UDL)