Hive可以通过设置某些参数防止危险操作。
(1)hive.strict.checks.no.partition.filter
分区表是否严格使用分区过滤。如果设置为true,对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行。换句话说,就是用户不允许扫描所有分区。进行这个限制的原因是,通常分区表都拥有非常大的数据集,而且数据增加迅速。没有设置分区限制的查询可能会消耗令人不可接受的巨大资源来处理这个表。
(2)hive.strict.checks.orderby.no.limit
使用order by时是否可以没有limit过滤。如果设置为true,对于使用了order by语句的查询,要求必须使用limit语句。因为order by为了执行排序过程会将所有的结果数据分发到同一个Reduce中进行处理,强制要求用户增加这个limit语句可以防止Reduce额外执行很长一段时间(开启了limit可以在数据进入到Reduce之前就减少一部分数据)。
(3)hive.strict.checks.cartesian.produce
是否限制笛卡尔积。如果设置为true,会限制笛卡尔积的查询。在关系型数据库中,用户在join查询的时候可以不使用on,而是使用where语句,这样关系型数据库的执行优化器就可以高效地将where语句转化成on语句。但是hive不会执行这样的优化,因此,如果表足够大,这个查询就会出现不可控的情况。