Hive学习笔记(三)—Hive分区表

一、分区简介

为了对表进行合理的管理以及提高查询效率,Hive可以将表组织成“分区”。

分区是表的部分列的集合,可以为频繁使用的数据建立分区,这样查找分区中的数据时就不需要扫描全表,这对于提高查找效率很有帮助

分区是一种根据“分区列”(partition column)的值对表进行粗略划分的机制。Hive中的每个分区对应数据库中相应分区列的一个索引,每个分区对应着表下的一个目录,在HDFS上的表现形式与表在HDFS上的表现形式相同,都是以子目录的形式存在

二、分区类型

Hive中支持两种类型的分区

  • 静态分区 SP(static partition)
  • 动态分区 DP(dynamic partition)

静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是通过数据来进行判断。详细来说,静态分区的列实在编译时期,通过用户传递来决定的;动态分区只有在 SQL 执行时才能决定

静态分区:

创建分区表:

create table test_partition(
    id int
) partitioned by (dt date comment "date partition field");

//创建分区
alter table t7_partition add partition(dt="2019-09-30");

分区列也不是表中的一个实际的字段,而是一个或者多个伪列。意思是说,在表的数据文件中实际并不保存分区列的信息与数据,这是因为它们源于目录名

Partitioned by子句中的列定义是表中正式的列,称为“分区列”partition column”

加载数据:

load data local inpath '/opt/data/hive/hive-t6.txt' into table test_partition;

FAILED: SemanticException [Error 10062]: Need to specify partition columns because the destination table is partitioned
不能直接向分区表加载数据,必须在加载数据之前明确加载到哪一个分区中,也就是子文件夹中。

向指定分区中增加数据:

load data local inpath '/opt/data/hive/hive-t6.txt' into table t7_partition partition (dt="2019-09-30");
如果想要插入一个月的数据,那么要写30条SQL,这时就需要动态分区了

分区DDL:

创建一个分区:
    alter table t7_partition add partition(dt="2019-09-30");
查看分区列表:
    show partitions t7_partition;
删除一个分区:
    alter table t7_partition drop partition(dt="2019-09-30");
动态分区

启用 hive 动态分区,只需要在 hive 会话中设置两个参数:

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

设置后上面的导入数据就不会报错了,可以动态识别导入数据

多分区字段:

create table test_partition(
    id int
) partitioned by (year int, school string); 

使用静态方式:
load data local inpath '/opt/data/hive/hive-t6.txt' into table test_partition partition(year=2019, school='qinghua');

使用静态 + 动态方式:
load data local inpath '/opt/data/hive/hive-t6.txt' into table test_partition partition(year=2019, school);

使用有误,没有注意顺序:
load data local inpath '/opt/data/hive/hive-t6.txt' into table test_partition partition(year, school='qinghua');
分区顺序决定了 HDFS 中目录的继承关系,这种会报错

三、分区的优缺点

庞大的数据集可能需要耗费大量的时间去处理。在许多场景下,可以通过分区或切片的方法减少每一次扫描总数据量,这种做法可以显著地改善性能。

数据会依照单个或多个列进行分区,通常按照时间、地域或者是商业维度进行分区。比如vido表,分区的依据可以是电影的种类和评级,另外,按照拍摄时间划分可能会得到更一致的结果。为了达到性能表现的一致性,对不同列的划分应该让数据尽可能均匀分布。最好的情况下,分区的划分条件总是能够对应where语句的部分查询条件。

Hive的分区使用HDFS的子目录功能实现。每一个子目录包含了分区对应的列名和每一列的值。但是由于HDFS并不支持大量的子目录,这也给分区的使用带来了限制。我们有必要对表中的分区数量进行预估,从而避免因为分区数量过大带来一系列问题

Hive查询通常使用分区的列作为查询条件。这样的做法可以指定MapReduce任务在HDFS中指定的子目录下完成扫描的工作。HDFS的文件目录结构可以像索引一样高效利用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值