建表语法:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] 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]
1.EXTERNAL 关键字 外部的
决定建表的类型
hive中的表分为两种类型
1)内部表(管理表)MANAGED_TABLE
2)外部表 EXTERNAL_TABLE
建表的时候指定这个关键字 则证明建的表是外部表 否则是内部表
内部表和外部表的区别:
最主要的一个区别 就是数据删除的时候
内部表是元数据和数据一起删除
外部表只删除元数据 原始数据不会被删除
一般情况下对于一些需要共享数据的表 一定需要建外部表
一般情况下内部表在建表的时候使用默认路径就可以了
外部表在建表的时候一般情况下需要指定表的数据存储目录为原始数据的存储目录
2.IF NOT EXISTS 忽略异常的语句
建表的时候如果添加上 如果表存在 则不抛错 但是表也不会被创建
if EXISTS
删表的时候指定可以忽略异常 如果表不存在 不会抛异常
上面的法则同样适用于数据库的创建和删除
3.COMMENT ‘’ 添加列的描述信息的
4.PARTITIONED BY (col_name data_type [COMMENT col_comment], …)
创建分区表 并指定分区字段
注意:
创建分区表的时候 分区字段一定不能再表的原始字段中存在
分区字段一定是一个全新的字段
5.[CLUSTERED BY (col_name, col_name, …)
[SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS]
创建分桶表 指定分桶字段 和分桶的个数
CLUSTERED BY 指定的分桶字段
注意:分桶表的分桶字段一定是表的原始字段中的一个或几个
SORTED BY:指定排序的字段 指定每一个桶表中的排序规则
INTO num_buckets BUCKETS:指定分桶的个数
分区表 和 分桶表
分区表:
分区字段的选取:
经常进行过滤的字段 通常情况下在生产中使用的分区字段最多的就是时间 地域
主要目的:减少数据的扫描范围 为了提高查询性能
hive来说存储的数据海量的数据 一个表中的数据量有可能很大 这个时候用户在进行查询的时候 比较困难的
select name,age from student where age<18;全表扫描
为了避免一个表中的数据量过于庞大,这个时候就出现了分区表
将一个庞大的数据表进行切分存储 切分的时候按照用户指定的分区字段进行存储
例如:学生表student/stu 有2T的数据量
字段有:id name sex age department
如果用户经常按照年龄进行查询 这时候就可以以年龄进行划分数据
student/17/stu
student/18/stu
student/19/stu
student/20/stu
select name,age from student where age<18; 不会进行全表扫描了 仅仅扫描student/17/stu 通过减少数据的扫描范围进行提升查询性能
分区表在目录结构上 相当于对数据进行按照分区字段划分成不同的数据目录
分桶表:
类似于MR中的分区的概念
相对于分区表更细粒度的对表的数据的一个划分
分桶表在目录结构上:相当于对数据按照分桶字段划分成不同的文件
对数据按照指定的分桶字段和分桶的个数进行数据的分桶
分桶字段 name 分桶个数 8
hive就可以对数据进行进一步的分桶切分存储
name.hashCode()%8—0 0号桶中
----1 1
—2 2
。。。。
----7 7
student/17/part-r-00000
student/17/part-r-00001
student/17/part-r-00002
student/17/part-r-00003
…
student/17/part-r-00007
作用:
1.提升抽样的效率
2.提升join的性能
6.ROW FORMAT row_format 指定分隔符
fields terminated by 指定列分隔符
lines terminated by 指定行分割符
items terminated by 指定集合中的元素的分割符
。。。。。
7. STORED AS file_format
指定原始文件的存储格式
TEXTFILE 默认情况下 不指定文件的存储方式 就默认这种存储方式 文本的存储方式
SEQUENCEFILE 二进制的存储格式
RCFILE 行列结合的存储方式
8.LOCATION hdfs_path 指定原始数据的存储目录
如果不指定 则存储在
hive.metastore.warehouse.dir
/user/hive/hive2.3.2/mydata
如果指定 则会覆盖配置文件中的目录 存储在指定的目录下