Hive主键、唯一约束等条件探索
- 一、官网查看
- 二、探索
- 1.官网操作
- 2.查找资料
- 3.官网验证
- 4.探索意义
一、官网查看
其中Create table:
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later)
[(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[SKEWED BY (col_name, col_name, ...) -- (Note: Available in Hive 0.10.0 and later)]
ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
[STORED AS DIRECTORIES]
[
[ROW FORMAT row_format]
[STORED AS file_format]
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)] -- (Note: Available in Hive 0.6.0 and later)
]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)] -- (Note: Available in Hive 0.6.0 and later)
[AS select_statement]; -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
LIKE existing_table_or_view_name
[LOCATION hdfs_path];
data_type
: primitive_type
| array_type
| map_type
| struct_type
| union_type -- (Note: Available in Hive 0.7.0 and later)
primitive_type
: TINYINT
| SMALLINT
| INT
| BIGINT
| BOOLEAN
| FLOAT
| DOUBLE
| DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)
| STRING
| BINARY -- (Note: Available in Hive 0.8.0 and later)
| TIMESTAMP -- (Note: Available in Hive 0.8.0 and later)
| DECIMAL -- (Note: Available in Hive 0.11.0 and later)
| DECIMAL(precision, scale) -- (Note: Available in Hive 0.13.0 and later)
| DATE -- (Note: Available in Hive 0.12.0 and later)
| VARCHAR -- (Note: Available in Hive 0.12.0 and later)
| CHAR -- (Note: Available in Hive 0.13.0 and later)
array_type
: ARRAY < data_type >
map_type
: MAP < primitive_type, data_type >
struct_type
: STRUCT < col_name : data_type [COMMENT col_comment], ...>
union_type
: UNIONTYPE < data_type, data_type, ... > -- (Note: Available in Hive 0.7.0 and later)
row_format
: DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
[NULL DEFINED AS char] -- (Note: Available in Hive 0.13 and later)
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
file_format:
: SEQUENCEFILE
| TEXTFILE -- (Default, depending on hive.default.fileformat configuration)
| RCFILE -- (Note: Available in Hive 0.6.0 and later)
| ORC -- (Note: Available in Hive 0.11.0 and later)
| PARQUET -- (Note: Available in Hive 0.13.0 and later)
| AVRO -- (Note: Available in Hive 0.14.0 and later)
| JSONFILE -- (Note: Available in Hive 4.0.0 and later)
| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
column_constraint_specification:
: [ PRIMARY KEY|UNIQUE|NOT NULL|DEFAULT [default_value]|CHECK [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]
default_value:
: [ LITERAL|CURRENT_USER()|CURRENT_DATE()|CURRENT_TIMESTAMP()|NULL ]
constraint_specification:
: [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
[, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
[, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES table_name(col_name, ...) DISABLE NOVALIDATE
[, CONSTRAINT constraint_name UNIQUE (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
[, CONSTRAINT constraint_name CHECK [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]
二、探索
1.官网操作
通过上方部分的:
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later)
[(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])]
中的[column_constraint_specification]
,并去查看[column_constraint_specification]的含义,发现包含:
column_constraint_specification:
: [ PRIMARY KEY|UNIQUE|NOT NULL|DEFAULT [default_value]|CHECK [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]
也就意味着可以通过create table table_name(id int primary key,name string)
来实现主键约束,但实际去操作发现报错;
2.查找资料
然后去搜索资料,发现可以建立主键的有用文档 其中操作为:
CREATE TABLE vendor
(
vendor_id INTEGER,
PRIMARY KEY (vendor_id) DISABLE NOVALIDATE RELY
);
发现这时可以创建成功,但进行插入数据后可以发现仍然可以插入重复数据,主键未生效;
然后继续查看该文档,发现这么一条:
- DISABLE 和NOVALIDATE现在是强制性的因为现在暂不支持默认的ENABLE 和VALIDATE,实际上就是上边介绍的hive未验证约束
也就是说该主键约束其实根本无效。
3.官网验证
之后再去官方文档查看验证:
发现主键、外键约束在hive2.1.0之后有,UNIQUE, NOT NULL, DEFAULT and CHECK constraints在hive3.0.0之后有,按这么来说主键约束应该是生效的,只要按这么写:
create table pk(id1 integer, id2 integer,
primary key(id1, id2) disable novalidate);
因为本文验证时的hive版本大于2.1.0
但本文最初贴出的文档部分内容中:
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later)
[(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])]
并没有限定版本,那么这样写应该可以才对:
create table table_name(id int primary key,name string)
结果不行,说明官方文档可能还有些问题,不能盲目确信
。之后再点进具体版本里查看:
发现:
查看翻译,也就说目前其实根本不执行主键等约束!
那目前可以建立主键外键意义何在?
4.探索意义
根据之前的参考文章和翻译,发现关键词:RELY
参考文章里写到:
- RELY/NORELY同样是可选的。如果一个约束指定RELY,也就是希望HIVE CBO(cost based optimize)使用约束信息来获得更好的统计,对不必要的连接删除( join elimination),来得到更好的整体执行计划。
- 正常来说外键的引用必须是唯一性索引,也就是unique或者主键,但是hive目前并不支持unique,因此目前外键的父列必须是主键。
也就可以猜想,此处建立主键外键其实是为了多表关联join
时可以使用来更好的统计,并进行优化