前言
在上篇文章《Hive 浅谈DDL语法》中我留了一个小尾巴,今天来还债了,为大家详细介绍一下Hive的建表语句。
建表语句解析
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 ]
- TEMPORARY : 表示创建的是临时表,Hive 0.14.0 版本开始支持
- EXTERNAL:表示创建的是外部表,
注意:默认没参数时创建内部表;有参数创建外部表。删除表,内部表的元数据和数据都会被删除,外部表元数据被删除,但HDFS的数据不会被删除。内部表数据由Hive自身管理,外部表数据由HDFS管理。
- COMMENT:为表和列添加注释
- data_type:数据类型Hive支持如下5种数据类型:
- primitive_type:基本数据类型
- TINYINT:微整型
- SMALLINT:短整型
- INT:整型
- BIGINT:长整型
- BOOLEAN:布尔类型
- FLOAT:单精度浮点数
- DOUBLE:双精度浮点数
- DOUBLE PRECISION :支持精确度的双精度浮点数,Hive 2.2.0 版本开始支持
- STRING:字符串
- BINARY:二进制数据,Hive 0.8.0 版本开始支持
- TIMESTAMP:时间戳,Hive 0.8.0 版本开始支持
- DECIMAL:十进制数字,Hive 0.11.0 版本开始支持
- DECIMAL(precision, scale):支持精确度的十进制数字,Hive 0.13.0 版本开始支持
- DATE:日期,Hive 0.12.0 版本开始支持
- VARCHAR :字符串类型,Hive 0.12.0 版本开始支持
- CHAR :定长字符串类型,Hive 0.13.0 版本开始支持
- array_type:数组类型
格式:ARRAY < data_type >
,数组包含一种任意数据类型。 - map_type:Map类型
格式:MAP < primitive_type, data_type >
,key必须是基本数据类型,value可以是任意数据类型 - struct_type:结构体类型
格式:STRUCT < col_name : data_type [COMMENT col_comment], ...>
,可以包含多个形如:列名:数据类型
的列,之间使用英文逗号分隔 - union_type : Union类型
格式:UNIONTYPE < data_type, data_type, ... >
,可以包含多个任意数据类型的组合体。注意:Hive 0.7.0 版本才开始支持union_type类型。
- column_constraint_specification:列约束规范主要有如下可选约束:
- PRIMARY KEY:主键,
注意:一个表只允许有一个主键
- UNIQUE:值唯一
- NOT NULL:值不为NULL
- DEFAULT [default_value] :设置默认值
- CHECK [check_expression] :检查
- ENABLE|DISABLE NOVALIDATE RELY/NORELY :指定是否开启约束
- ENABLE NOVALIDATE:启用约束,仅对新加入的数据强制执行约束,而不管表中的现有数据
- DISABLE NOVALIDATE:关闭约束,可以对约束列的数据进行修改等操作
- RELY/NORELY:可选项,RELY表示希望HIVE CBO(COST BASED OPTIMIZE)使用约束信息来获得更好的统计,删除不必要的连接( JOIN ELIMINATION),得到更好的整体执行计划;NORELY表示不会使用HIVE CBO。
- constraint_specification:另外一种形式的约束,
注意:该语句和定义字段是平行的
- PRIMARY KEY (col_name, …):可以指定多个列适用于某种约束
- CONSTRAINT constraint_name:可以指定约束名
- FOREIGN KEY (col_name, …) REFERENCES table_name(col_name, …):可以指定其他表的主键为其外键
- PARTITIONED BY:表示创建分区表 ,
注意:分区字段不能是表中定义好的字段,通常根据 日期或者城市 等进行分区
- CLUSTERED BY:表示创建分桶表,还可以在分桶列上进行SORTED BY排序
- SKEWED BY:对某些列进行数据倾斜处理,
注意:Hive 0.10.0 版本开始支持
- row_format:行数据格式
- DELIMITED:指定数据文件中的分隔符(默认单字节),例如逗号、制表符、空格等等,默认的分隔符为\001
- FIELDS TERMINATED BY char :指定字段(列)之间的分隔符
- COLLECTION ITEMS TERMINATED BY char:指定集合元素之间的分隔符
- MAP KEYS TERMINATED BY char:指定map元素kv之间的分隔符
- LINES TERMINATED BY char:指定行分隔符,默认是换行符
- NULL DEFINED AS char:指定替换空值的字符,
注意:Hive 0.13 版本才开始支持
- SERDE serde_name:SerDe是英文Serialize和Deserilize的组合缩写,是Hive提供用来解析和加载不同类型的数据文件,默认提供了多种SerDe,常用的有ORCSerde 、RegexSerde、JsonSerDe等
- file_format:文件格式支持如下文件格式:
- SEQUENCEFILE:二进制序列化文件
- TEXTFILE:文本格式,默认值,可以通过配置项hive.default.fileformat修改默认文件格式
- RCFILE:RC文件格式,Hive 0.6.0 版本开始支持
- ORC:ORC文件格式,Hive 0.11.0 版本开始支持
- PARQUET:parquet文件格式,Hive 0.13.0 版本开始支持
- AVRO :AVRO文件格式,Hive 0.14.0 版本开始支持
- JSONFILE:json文件格式,Hive 4.0.0 版本开始支持
- INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname:自定义输入输出文件格式
- LOCATION:指定表的数据文件在hdfs上的存储路径
- TBLPROPERTIES:指定配置项
- AS select_statement :根据查询结果创建表,即创建表过程中同时插入查询结果数据,
注意:外部表不支持
- LIKE:允许用户复制现有的表结构,若有LOCATION才会复制数据,否则不复制数据