HIVE Temporary Table&Constraint
这两介绍下hive的临时表和表约束。
Temporary Table
创建的临时表仅仅在当前会话是可见的,数据将会被存储在用户的暂存目录中,并在会话结束时被删除。如果创建临时表的名字与当前数据库下的一个非临时表相同,则在这个会话中使用这个表名字时将会使用的临时表,而不是非临时表,用户在这个会话内将不能使用原表,除非删除或者重命名临时表。
临时表有如下限制:
- 不支持分区字段
- 不支持创建索引
在Hive1.1.0之后临时表可以存储到memory,ssd或者default中,可以通过配置 hive.exec.temporary.table.storage来实现,存储策略可以参考文献3。
一般使用CREATE TEMPORARY TABLE ….来创建临时表。临时表也支持多种创建操作和insert操作。
CREATE TEMPORARY TABLE ….,CTAS, CTL, INSERT INTO。
Constraints
Hive包含对未经验证的主键和外键约束的支持,一些sql工具在存在约束时会生成更加高效的查询,由于这些限制条件未经验证,上游系统在加载到Hive之前需要确保数据的完整性。
常用的PK( PRIMARY KEY)和FK(FOREIGN KEY)约束使用如下:
CREATE TABLE product
(
product_id INTEGER,
product_vendor_id INTEGER,
PRIMARY KEY (product_id) DISABLE NOVALIDATE,
CONSTRAINT product_fk_1 FOREIGN KEY (product_vendor_id) REFERENCES vendor(vendor_id) DISABLE NOVALIDATE
);
CREATE TABLE vendor
(
vendor_id INTEGER,
PRIMARY KEY (vendor_id) DISABLE NOVALIDATE RELY
);
create table pk(id1 integer, id2 integer,
primary key(id1, id2) disable novalidate);
在上面的语法中,需要注意一下几点:
- [CONSTRAINT constraint-Name]是可选的,定义一个约束名称,若是没有指定系统会生成一个约束名称,为简单起见,CONSTRAINT在外键时可以使用,因为每个表只有一个主键因此没有必要定义约束名称。
- RELY/NORELY同样是可选的。如果一个约束指定RELY,也就是希望HIVE CBO(cost based optimize)使用约束信息来获得更好的统计,对不必要的连接删除( join
elimination),来得到更好的整体执行计划。 - DISABLE 和NOVALIDATE现在是强制性的因为现在暂不支持默认的ENABLE 和VALIDATE,实际上就是上边介绍的hive未验证约束。
- 一个表只允许有一个主键约束。
- 正常来说外键的引用必须是唯一性索引,也就是unique或者主键,但是hive目前并不支持unique,因此目前外键的父列必须是主键。
hive对约束也支持alter语句如下:
ALTER TABLE sales
ADD CONSTRAINT pk1 PRIMARY KEY (sales_id) DISABLE NOVALIDATE;
ALTER TABLE product
ADD CONSTRAINT fk1 FOREIGN KEY p_id REFERENCES owner(o_id)DISABLE
NOVALIDATE;
ALTER TABLE sales
DROP CONSTRAINT pk1;
ALTER TABLE product
DROP CONSTRAINT fk1;
参考文献
1.HIVE-7090
2.HIVE Temporary Tables
3.HDFS Storage Types and Storage Policies
4.HIVE-13290
5.HIVE-13076
6.HIVE-13019