将 HCatalog 架构或表与局部架构或表同步

由于 Hive 的性能问题,从 HCatalog 架构查询数据可能会很慢。当您希望检查 Hive 数据库中表的结构时,这一缓慢的性能可能特别令人头疼。从 Hive 获取此信息需要您使用 HCatalog 连接器查询 HCatalog 架构的元数据。

为了避免这一性能问题,您可以使用 SYNC_WITH_HCATALOG_SCHEMA 函数,在 Vertica 架构内创建 HCatalog 架构元数据的快照。您将向此函数提供:预先存在的 Vertica 架构(通常是通过 CREATE HCATALOG SCHEMA 创建的那个架构)的名称以及一个通过 HCatalog 连接器获得的 Hive 架构。您必须在 Vertica 中拥有写入数据的权限,在 Hive 和 HDFS 中拥有读取数据的权限。

此函数将在 Vertica 架构内创建一个外部表集,而您随后可将该外部表集用于检查 Hive 数据库内表的结构。由于 Vertica 架构中的元数据是本地的,因此查询计划要快得多。您还可以使用标准 Vertica 语句和系统表查询来检查 HCatalog 架构中 Hive 表的结构。

当 SYNC_WITH_HCATALOG_SCHEMA 在 Vertica 中创建表时,它会使 Hive 的 STRING 和 BINARY 类型与 Vertica 的 VARCHAR(65000) 和 VARBINARY(65000) 类型相匹配。在以下两种情况下,您可能会希望使用 ALTER TABLE SET DATA TYPE 来更改这些长度:

  • 如果 Hive 中的值大于 65000 字节,增加其大小并使用 LONG VARCHAR 或 LONG VARBINARY,以免数据被截断。如果 Hive 字符串使用多字节编码,您必须增加 Vertica 的大小,以免数据被截断。需要执行这一步骤的原因是,Hive 按字符计算字符串长度,而 Vertica 按字节计算长度。

  • 如果 Hive 中的值远小于 65000 字节,减少其大小,以节约 Vertica 的内存。

Vertica 架构只不过是 HCatalog 架构元数据的一个快照。在您调用 SYNC_WITH_HCATALOG_SCHEMA 之后,Vertica 不会使用本地架构将后来的更改同步到 HCatalog 架构。您可以再次调用此函数,将本地架构重新同步到 HCatalog 架构。如果您更改了列数据类型,您将需要重复这些更改,因为此函数将创建新的外部表。

默认情况下,SYNC_WITH_HCATALOG_SCHEMA 不会删除出现在本地架构中、但未出现在 HCatalog 架构中的表。因此,此函数调用后,本地架构将不反映自上次调用以来 Hive 数据库中已删除的表。您可以通过以下方式更改此行为:提供可选的第三个布尔参数,让函数删除本地架构中无法与 HCatalog 架构中的表对应的任何表。

您可以使用 SYNC_WITH_HCATALOG_SCHEMA_TABLE 同步个别表,而无需同步整个架构。如果 Vertica 中已经存在该表,此函数会将其覆盖。如果 HCatalog 架构中找不到该表,此函数将返回错误。在所有其他方面,此函数的表现与 SYNC_WITH_HCATALOG_SCHEMA 相同。

如果更改任何 HCatalog 连接器配置参数 (Hadoop 参数) 的设置,则必须再次调用此函数。

示例

下面的示例演示了如何调用 SYNC_WITH_HCATALOG_SCHEMA,将 Vertica 中的 HCatalog 架构与 Hive 中的元数据同步。由于函数直接同步 HCatalog 架构,而不是将其他架构与 HCatalog 架构同步,两个参数都是相同的。

=> CREATE HCATALOG SCHEMA hcat WITH hostname='hcathost' HCATALOG_SCHEMA='default'
   HCATALOG_USER='hcatuser';
CREATE SCHEMA
=> SELECT sync_with_hcatalog_schema('hcat', 'hcat');
sync_with_hcatalog_schema
----------------------------------------
Schema hcat synchronized with hcat
tables in hcat = 56
tables altered in hcat = 0
tables created in hcat = 56
stale tables in hcat = 0
table changes erred in hcat = 0
(1 row)

=> -- Use vsql's \d command to describe a table in the synced schema

=> \d hcat.messages
List of Fields by Tables
  Schema   |   Table  | Column  |      Type      | Size  | Default | Not Null | Primary Key | Foreign Key
-----------+----------+---------+----------------+-------+---------+----------+-------------+-------------
hcat       | messages | id      | int            |     8 |         | f        | f           |
hcat       | messages | userid  | varchar(65000) | 65000 |         | f        | f           |
hcat       | messages | "time"  | varchar(65000) | 65000 |         | f        | f           |
hcat       | messages | message | varchar(65000) | 65000 |         | f        | f           |
(4 rows)

此示例演示了如何与使用 CREATE HCATALOG SCHEMA 创建的架构同步。此外,与使用 CREATE SCHEMA 创建的架构同步亦可获得支持。

将本地架构与 HCatalog 架构同步后,您可在该本地架构中查询表。然而,在同步后的架构中查询表并未比直接查询 HCatalog 架构快很多,因为 SYNC_WITH_HCATALOG_SCHEMA 仅复制 HCatalog 架构的元数据。表中的数据仍要使用 HCatalog 连接器进行检索。