hive 4.0.0 DDL
倾斜表
如果一个表中具有一个或多个列具有偏斜值,那么可以创建倾斜表来提高此表的性能。 通过指定经常出现的值(即倾斜值),Hive 会自动将这些值拆分为单独的文件(或表存储时的目录),并在查询期间考虑这一事实,如果可能的话,它可以跳过或包含整个文件(或目录)。可以在表创建期间在表级别进行指定。
下表表示字段key的1,5,6具有倾斜倾向
CREATE TABLE list_bucket_single (key STRING, value STRING)
SKEWED BY (key) ON (1,5,6) [STORED AS DIRECTORIES];
具有两个倾斜列的示例:
CREATE TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING)
SKEWED BY (col1, col2) ON (('s1',1), ('s3',3), ('s13',13), ('s78',78)) [STORED AS DIRECTORIES];
倾斜表的alter语句
ALTER TABLE table_name SKEWED BY (col_name1, col_name2, ...)
ON ([(col_name1_value, col_name2_value, ...) [, (col_name1_value, col_name2_value), ...]
[STORED AS DIRECTORIES];
STORED AS DIRECTORIES 选项确定倾斜表是否使用列表存储功能,该功能为倾斜值创建子目录。
ALTER TABLE table_name NOT SKEWED;
将倾斜表修改为非倾斜表。NOT SKEWED 选项使表不倾斜并关闭列表存储功能(因为列表存储表总是倾斜的)。 这会影响在 ALTER 语句之后创建的分区,但对在 ALTER 语句之前创建的分区没有影响。
ALTER TABLE table_name NOT STORED AS DIRECTORIES;
关闭列表分桶功能,但表仍然是倾斜的。
ALTER TABLE table_name SET SKEWED LOCATION (col_name1="location1" [, col_name2="location2", ...] );
这会更改列表分桶的位置映射。
临时表
已创建为临时表的表仅对当前会话可见。 数据将存储在用户的临时目录中,并在会话结束时删除。
如果临时表是使用数据库中已存在的永久表的数据库/表名称创建的,则在该会话中对该表的任何引用都将解析为临时表,而不是永久表。 如果不删除临时表或将其重命名为不冲突的名称,用户将无法访问该会话中的原始表。
临时表有以下限制:
不支持分区。
不支持创建索引。
从 Hive 1.1.0 开始,可以使用 hive.exec.temporary.table.storage 配置参数将临时表的存储策略设置为 memory、ssd 或默认值(请参阅 HDFS 存储类型和存储策略)。
创建临时表示例:
CREATE TEMPORARY TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING);
事务表
Hive 4.0 引入。
支持带有 ACID(原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)) 语义的操作的表。
事务表创建示例:
CREATE TRANSACTIONAL TABLE transactional_table_test(key string, value string) PARTITIONED BY(ds string) STORED AS ORC;
约束
Hive 2.1.0引入。
Hive 包括对未经验证的主键和外键约束的支持。 当存在约束时,一些 SQL 工具会生成更高效的查询。 由于这些约束未经验证,上游系统需要在将数据加载到 Hive 之前确保数据完整性。
create table pk(id1 integer, id2 integer,
primary key(id1, id2) disable novalidate);
create table fk(id1 integer, id2 integer,
constraint c1 foreign key(id1, id2) references pk(id2, id1) disable novalidate);
Hive 包括对 UNIQUE、NOT NULL、DEFAULT 和 CHECK 约束的支持。 除了 UNIQUE 之外,还强制执行所有三种类型的约束。
create table constraints1(id1 integer UNIQUE disable novalidate, id2 integer NOT NULL,
usr string DEFAULT current_user(), price double CHECK (price > 0 AND price <= 1000));
create table constraints2(id1 integer, id2 integer,
constraint c1_unique UNIQUE(id1) disable novalidate);
create table constraints3(id1 integer, id2 integer,
constraint c1_check CHECK(id1 + id2 > 0));
不支持复杂数据类型(例如 map、struct、array)的 DEFAULT。