Hive知识之内外部表和分区表

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;

参考链接:

https://www.cnblogs.com/yongjian/p/6640951.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值