Hive 提供了一个严格模式,可以防止用户执行那些可能意想不到的不好的影响的查询。
通过设置属性 hive.mapred.mode 值为默认是非严格模式 nonstrict 。开启严格模式需要
修改 hive.mapred.mode 值为 strict。
<property>
<name>hive.mapred.mode</name>
<value>strict</value>
</property>
开启严格模式可以禁止 3 种类型的查询
- 对于分区表,除非 where 语句中含有分区字段过滤条件来限制范围,否则不允许执行。
换句话说,就是用户不允许扫描所有分区。进行这个限制的原因是,通常分区表都拥有
非常大的数据集,而且数据增加迅速。没有进行分区限制的查询可能会消耗令人不可接
受的巨大资源来处理这个表。 - 对于使用了 order by 语句的查询,要求必须使用 limit 语句。因为 order by 为了执行排
序过程会将所有的结果数据分发到同一个 Reducer 中进行处理,强制要求用户增加这个
LIMIT 语句可以防止 Reducer 额外执行很长一段时间。 - 限制笛卡尔积的查询。对关系型数据库非常了解的用户可能期望在执行 JOIN 查询的时
候不使用 ON 语句而是使用 where 语句,这样关系数据库的执行优化器就可以高效地将
WHERE 语句转化成那个 ON 语句。不幸的是,Hive 并不会执行这种优化,因此,如果
表足够大,那么这个查询就会出现不可控的情况。