随着互联网发展,数据海量形问题越来越严重,PB级别的数据量已经非常常见。用传统数据库查询这么巨大的数据会很困难。而 Hive 的出现降低了数据查询的负担。Apache Hive 把 SQL 代码转换的 MapReduce 作业,并提交到 Hadoop 集群执行。但是若提交一个 SQL 查询的时候,Hive均读取全部数据集则会很耗时。若表的数据非常大,那么 MapReduce 作业的执行就比较低效。因此,在表创建分区可以明显提升数据查询效率。
Hive 分区其实就是将表中的数据按照一定规则散列成多个分区。常见的例如按照月分区、不同日期的分区。因此在具体查询数据时只需查对应分区的数据就可以,而不需要全表搜索,大大降低了查询时的时间开销。
1、当前 Hive主要分为两种分区类型
- 静态分区
- 动态分区
A、Hive 静态分区
- 把输入数据文件单独插入分区表的叫静态分区。
- 通常在加载文件(大文件)到 Hive 表的时候,首先选择静态分区。
- 在加载数据时,静态分区比动态分区更节省时间。
- 可以通过 alter table add partition语句在表中添加一个分区,并将文件移动到表的分区中。
- 可以修改静态分区中的分区。
- 可以从文件名、日期等获取分区列值,而无需读取整个大文件。
- 如果要在 Hive 使用静态分区,需要把 hive.mapred.mode设置为 strict,set hive.mapred.mode=strict。 静态分区是在严格模式进行下。 可以在 Hive
- 的内部表和外部表使用静态分区。
B、Hive 动态分区
- 对分区表的一次性插入称为动态分区。
- 通常动态分区表从非分区表加载数据。
- 在加载数据的时候,动态分区比静态分区会消耗更多时间。
- 如果需要存储到表的数据量比较大,那么适合用动态分区。
- 假如要对多个列做分区,但又不知道有多少个列,那么适合使用动态分区。
- 动态分区不需要 where 子句使用 limit。
- 不能对动态分区执行修改。
- 可以对内部表和外部表使用动态分区。
- 使用动态分区之前,需要把模式修改为非严格模式。
创建分区表:
create table test_detail (
test_id string,
email string,
app_name string
) partitioned by (date_time string) stored as orc;
按照分区添加数据:
insert into table test_detail partition (date_time) select test_id, email, app_name, date_time from orders;
注意:
- 动态添加分区的时候,查询的分区字段必须放在最后面(order_dow),否则结果不是你想要的;
- 往表中导入数据时,查询的字段个数必须和目标的字段个数相同,不能多,也不能少,否则会报错。但是如果字段的类型不一致的话,则会使用null值填充,不会报错。而使用load
- data形式往hive表中装载数据时,则不会检查。如果字段多了则会丢弃,少了则会null值填充。同样如果字段类型不一致,也是使用null值填充。
Hive 分区的好处:
1、Hive 的分区可以水分分散执行压力。
2、数据查询性能比较好。
3、不需要在整个表列中搜索单个记录。
Hive 分区的缺点:
1、可能会创建太多的小分区,也就是说可能会创建很多目录。
2、分区对于低容量数据是有效的,但有些查询比如对大的数据量进行分组需要消耗很长时间。