相比mysql,hive有严格模式存在,为了不错误扫描整个数据,hive的分区表会将数据分成几个分区。
查询分区表中的数据时,除非where语句中包含分区字段过滤条件来显示数据范围,否则不允许执行。也就是说用户不允许扫描所有的分区。进行这个限制的原因是,通常分区表都拥有非常大的数据集,而且数据增加迅速,如果没有进行分区限制的查询会消耗很大的资源来处理这个表
动态分区和静态分区的区别
静态分区
- 静态分区是在编译期间指定的指定分区名
- 支持load和insert两种插入方式
- load方式
1. 会将分区字段的值全部修改为指定的内容
2. 一般是确定该分区内容是一致的时候才会使用 - insert方式
1. 必须先将数据放在一个没有设置分区的普通表中
2. 该方式可以在一个分区内存储一个范围的内容
3. 从普通表中选出的字段不能包含分区字段
- load方式
- 适用于分区数少,分区名可以明确的数据
动态分区
- 根据分区字段的实际值,动态进行分
- 是在sql执行的时候进行分
- 需要先将动态分区设置打开(set hive.exec.dynamic.partition.mode=nonstrict )
- 只能用insert
- 通过普通表选出的字段包含分区字段,分区字段放置在最后,多个分区字段按照分区顺序放置
非严格模式
在查询数据时无需加where条件指定分区。默认情况下hive就是非严格模式。
严格模式
可以防止在查询数据时因为误操作扫描整个数据。(你知道的,当数据很大时,扫描所有数据会非常耗时间)
设置严格模式
我们在没设置初始化文件.hiverc的时候,在hive命令行中输入
set hive.mapred.mode=strict;
但是这种方法不是很可靠,因为他只存在在这一次hive中,当你关闭hive后再打开,他就会恢复成默认。那么我们需要修改hive启动的初始化文件.hiverc
这个文件在: hive的安装文件夹中/bin
写入
# 在命令行中显示当前数据库名
set hive.cli.print.current.db=true;
# 查询出来的结果显示列的名称
set hive.cli.print.header=true;
# 设置hive执行的严格模式
set hive.mapred.mode=strict;









网友评论