CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
[(col_name data_type [COMMENT col_comment], ...)]
[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]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
(1)TEMPORARY
创建临时表,会话结束表会被删除
(2)EXTERNAL
创建外部表,不加创建内部表,关于两者区别具体见: Hive内部表和外部表的区别-CSDN博客
(3) PARTITION BY
创建分区表。分区表就是把一张大表的数据分散存储到多个目录下,这样在查询时就能够通过添加where子句选择所要查询的分区,提高查询效率。实际生产中常见的是按照日期进行分区。
create table dept_partition (
deptno int,
deptname string,
loc string
)
partition by (day string)
row format delimited fields terminated by '\t';
(4)ClUSTERED BY ... [SORTED BY ... ]INTO ... BUCKETS
创建分桶表。分桶表针对的是数据文件。其基本原理是:依据指定字段为每行数据计算一个hash值,然后让这个hash值对分桶数取模,取模结果相同的写入一个桶。
添加sorted by关键字,创建分桶排序表。
(5) ROW FORMAT
在进行数据的持久化存盘和网络传输时,需要对数据进行序列化处理,也就是将内存中的对象转换为字节码序列;反序列化就是将字节码序列转换为内存中的对象。hive是分布式框架,涉及到不同节点之间的网络传输,需要为数据指定序列化和反序列化方法,即指定SERDE(Serializer 和 Deserializer)。具体有以下两种语法:
① row format delimited
delimited关键字表示对文件中的每个字段按照指定分隔符进行分割,其会使用默认的SERDE对每行数据进行序列化和反序列化。
row format delimited
[fields terminated by char] # 用来指定列分隔符
[collection items terminated bt char] # map\struct\array中每个元素之间的分隔符
[map keys terminated by] # map 的key与value之间的分隔符
[lines terminated by char] # 行分隔符
[null defined as char]
② row format serde
serde关键字显示指定所需要使用的serde
row format serde serde_name
[with serdeproperties (property_name=property_value,property_name=property_value,...)]
如在使用flume将数据从Kafka读取到hdfs上时,读取的数据是json格式,则不同通过delimited关键字指定分隔符,此时需要用serde关键字,告诉hive数据格式, hive才能正确解析。
row format serde 'org.apache.hadoop.hive.serde2.JsonSerDe'
(6)STORED AS
指定数据文件格式,常见的文件格式有:textfile(默认)、orc、parquet、sequence等
(7)LOCATION
指定表格数据所在的hdfs路径,不写则默认在/user/hive/warehouse/db_name.bd/table_name路径下。可以任意指定,然后通过load将数据装载过来。
(8)TBLPROPERTIES
用于配置表的一些kv键值对参数。