将 HCatalog 架构或表与局部架构或表同步
由于 Hive 的性能问题,从 HCatalog 架构查询数据可能会很慢。当您希望检查 Hive 数据库中表的结构时,这一缓慢的性能可能特别令人头疼。从 Hive 获取此信息需要您使用 HCatalog 连接器查询 HCatalog 架构的元数据。
为了避免这一性能问题,您可以使用 SYNC_WITH_HCATALOG_SCHEMA 函数,在 Vertica 架构内创建 HCatalog 架构元数据的快照。您将向此函数提供:预先存在的 Vertica 架构(通常是通过 CREATE HCATALOG SCHEMA 创建的那个架构)的名称以及一个通过 HCatalog 连接器获得的 Hive 架构。您必须在 Vertica 中拥有写入数据的权限,在 Hive 和 HDFS 中拥有读取数据的权限。
注意
要同步架构,您必须对 HDFS 中的底层文件具有读取权限。如果 Hive 使用 Sentry 来管理授权,则您可以使用 ACL 同步来管理 HDFS 访问。否则,此函数的用户必须在 HDFS 中具有读取访问权限。此函数将在 Vertica 架构内创建一个外部表集,而您随后可将该外部表集用于检查 Hive 数据库内表的结构。由于 Vertica 架构中的元数据是本地的,因此查询计划要快得多。您还可以使用标准 Vertica 语句和系统表查询来检查 HCatalog 架构中 Hive 表的结构。
当心
SYNC_WITH_HCATALOG_SCHEMA 函数会覆盖 Vertica 架构中名称与 HCatalog 架构中的表格匹配的表格。请勿使用 Vertica 架构来存储其它数据。当 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 连接器进行检索。