1、内外部表
CREATE [external] TABLE IF NOT EXISTS 表名.......
- 创建数据表可以通过 external 指定创建外部表,如果不指定则默认是内部表
1.1 内部表
- 内部表(也叫管理表)数据由Hive自身管理,内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse)
- 当删除一个内部表时,会直接删除元数据(metadata)及存储数据
- 内部表不方便和其它工作共享数据
1.2 外部表
-
外部表用关键字 external 来指定说明
-
外部表数据由HDFS管理,存储位置可以由自己指定(如果没有LOCATION,Hive将在HDFS上的/user/hive/warehouse文件夹下以外部表的表名创建一个文件夹,并将属于这个表的数据存放在这里)
-
当删除一个外部表时,仅仅会删除元数据,HDFS上的存储数据并不会被删除。
-
在生产中一般会创建外部表来存储数据。
参考链接:
https://blog.csdn.net/qq_36743482/article/details/78393678
2、分区表
CREATE [external] TABLE IF NOT EXISTS 表名...
[partitioned by (列名 数据类型 [comment 本列注释],..)]...
- 创建数据表可以通过 partitioned by 指定创建分区表,如果不指定则默认不是分区表
- 需要注意的是:partitioned by子句中定义的列是表中正式的列,但是Hive下的数据文件中并不包含这些列,因为它们是目录名。
- 分区表可以将数据以一种符合逻辑的方式进行组织,比如分层存储
- 查询分区表中的数据时,除非 WHERE 语句中包含分区字段过滤条件来显示数据范围,否则不允许执行,因为没有进行分区限制的查询可能会消耗巨大的资源来处理数据表。
- 分区表有静态分区和动态分区两种形式
2.1 静态分区
- 静态分区是指增加数据时需要手动指定具体的分区目录
- 静态分区的列是在编译时期,通过用户传递列名来决定的。
- 静态分区不管有没有数据都将会创建该分区
# 手动指定分区目录,查询结果没有数据也会创建该分区
insert overwrite table tbl_name partition(pt=20121023, if_online=1)
select field1, field2, ..., fieldn
from tbl
where xxx;
2.2 动态分区
- 动态分区增加数据时不用手动指定分区目录,而是由系统通过数据来进行判断。
- 动态分区是在SQL执行的时候确定的
- 动态分区是有结果集将创建该分区,否则不创建。
- 动态分区虽然方便快捷,但创建太多分区时可能会占用大量资源。
# 系统自动判断分区目录,select 最后面必须是动态分区字段,查询结果没有数据不会创建该分区
insert overwrite table tbl_name partition(pt, if_online)
select field1, field2, ..., pt, if_online
from tbl
where xxx;
参考链接: