hive的严格模式和分区

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive的严格模式和分区相关的知识,希望对你有一定的参考价值。

参考技术A 相比mysql,hive有严格模式存在,为了不错误扫描整个数据,hive的分区表会将数据分成几个分区。
查询分区表中的数据时,除非where语句中包含分区字段过滤条件来显示数据范围,否则不允许执行。也就是说用户不允许扫描所有的分区。进行这个限制的原因是,通常分区表都拥有非常大的数据集,而且数据增加迅速,如果没有进行分区限制的查询会消耗很大的资源来处理这个表

在查询数据时无需加where条件指定分区。默认情况下hive就是非严格模式。

可以防止在查询数据时因为误操作扫描整个数据。(你知道的,当数据很大时,扫描所有数据会非常耗时间)

我们在没设置初始化文件.hiverc的时候,在hive命令行中输入

但是这种方法不是很可靠,因为他只存在在这一次hive中,当你关闭hive后再打开,他就会恢复成默认。那么我们需要修改hive启动的初始化文件.hiverc
这个文件在: hive的安装文件夹中/bin
写入

Hive优化:严格模式

参考技术A Hive提供了一个严格模式,可以防止用户执行那些可能意想不到的不好的影响查询。
通过设置属性hive.mapred.mode值为默认是非严格格式nonstrict。开启严格模式需要修改hive.mapred.mode值为strict,开启严格模式可以禁止3钟类型的查询。
--设置非严格模式(默认)
set hive.mapred.mode=nonstrict;
--设置严格模式
set hive.mapred.mode=strict;
(1)对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行
--设置严格模式下 执行sql语句报错;非严格模式下的可以的
select * from order_partition;
异常信息:Error :Error while compliling statement:FAILED:SemanticException [Error 10041]:No parttion predicate found for Alias "order_partition" Table "order_partition"
(2)对于使用了order by 语句的查询,要求必须使用limit语句
--设置严格模式下 执行sql语句报错;非严格模式下可以的
select * from order_partition where month='2019-03' order by order_price;
异常信息:Error Error while compiling statement:FAILED:SemanticException 1:61 In strict mode,if ORDER BY is specified ,LIMIT must also be specifiied.Error encountered near token 'order_price'
(3)限制笛卡尔积的查询
严格模式下,避免出现笛卡尔积的查询

以上是关于hive的严格模式和分区的主要内容,如果未能解决你的问题,请参考以下文章

Hive的严格模式

hive严格模式

Hive动态分区报错

Hive严格模式

hive 错误 FAILED: SemanticException [Error 10041]: No partition predicate found for

Hive分区参考