高效辨别Hive的静态和动态分区

Hive分区:

1、Hive中有分区表的概念,我们可以看到分区具有重要性能优势,分区表可以将数据以一种符合逻辑的方式进行组织,比如分层存储。
2、查询分区表中的数据时,除非where语句中包含分区字段过滤条件来显示数据范围,否则不允许执行。
3、换句话说,就是用户不允许扫描所有的分区。
4、进行这个显示的原因是,通常分区表都拥有非常大的数据集,而且数据增加迅速。如果没有进行分区限制的查询可能会消耗令人不可接受的巨大资源来处理这个表。
5、分区是hive存放数据的一种方式。将列值作为目录来存放数据,就是一个分区。这样查询时使用分区列进行过滤,只需根据列值直接扫描对应目录下的数据,不扫描其他不关心的分区,快速定位,提高查询效率。

静态分区表和动态分区表的区别:

静态分区是手动指定的。
动态分区是通过数据来进行判断。
静态分区的列是在编译时期,通过用户传递列名来决定。
动态分区是在SQL执行的时候来确定的。

静态分区:

若分区的值是确定的,那么称为静态分区。新增分区或者是加载分区数据时,已经指定分区名。

  • 创建分区:
create table test
(name string,age int)
partitioned by (country string)
row format delimited fields terminated by '\t'
lines terminated by '\n'
stored as textfile;
  • 向分区表中插入数据:
insert into table test partition(country="china")
values("zhangsan",1);
insert into table test partition(country="usa")
values("james",34);
insert into table test partition(country="usa")
values("tom",2);
  • 查询分区表的数据:
select * from test where country="china";
  • 删除分区:
alter table test drop partition(country="china");
  • 加载数据指定分区:
load data local inpath '/root/Desktop/student.txt' into table test partition(name='zs',age=21);
动态分区:

分区的值是非确定的,由输入数据来确定.
动态分区的相关属性:

hive.exec.dynamic.partition=true :是否允许动态分区
hive.exec.dynamic.partition.mode=strict :分区模式设置
strict:最少需要有一个是静态分区
nostrict:可以全部是动态分区
hive.exec.max.dynamic.partitions=1000 :允许动态分区的最大数量
hive.exec.max.dynamic.partitions.pernode =100 :单个节点上的mapper/reducer允许创建的最大分区
在这里插入图片描述

  • 动态分区:
set hive.exec.dynamic.partition=true;
(可通过这个语句查看:
set hive.exec.dynamic.partition;)
set hive.exec.dynamic.partition.mode=nonstrict;
SET hive.exec.max.dynamic.partitions=100000;(如果自动分区数
大于这个参数,将会报错)
SET hive.exec.max.dynamic.partitions.pernode=100000;
  • 显示分区数:
show partitions order_part;
  • 查询分区表中的数据:
select * from user_trade limit 6;这样会报错,因为没有加分区条
件。
  • 严格模式:
set hive.mapred.mode=strict;
select * from user_trade limit 6;
select * from user_trade where dt='2017-01-12';

分区时注意:

1、尽量不要用动态分区,因为动态分区的时候,将会为每一个分区分配reducer数量,当分区数量多的时候,reducer数量将会增加,对服务器是一种灾难。
2、动态分区和静态分区的区别,静态分区不管有没有数据都将会创建该分区,动态分区是有结果集将创建,否则不创建。
3、hive动态分区的严格模式和hive提供的hive.mapred.mode的严格模式。
hive提供我们一个严格模式:为了阻止用户不小心提交恶意hql

hive.mapred.mode=nostrict : strict

如果该模式值为strict,将会阻止以下三种查询:

1、对分区表查询,where中过滤字段不是分区字段。
2、笛卡尔积join查询,join查询语句,不带on条件或者where条件。
3、对order by查询,有order by的查询不带limit语句。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章