前话:

 order by 等。。

hive 中的 order by 语句会对查询结果做一次全局排序,即,所有的 mapper 产生的结果都会交给一个 reducer 去处理,无论数据量大小,job 任务只会启动一个 reducer,如果数据量巨大,则会耗费大量的时间。

注意:如果在严格模式下,order by 需要指定 limit 数据条数,不然数据量巨大的情况下会造成崩溃无输出结果。涉及属性:set hive.mapred.mode=nonstrict/strict


 

hive严格模式

 hive提供了一个严格模式,可以防止用户执行那些可能产生意想不到的不好的效果的查询。即某些查询在严格
模式下无法执行。

配置中有个参数hive.mapred.mode,分为nonstrict,strict,默认是nonstrict

如果设置为strict,会对三种情况的语句在compile环节做过滤(可以禁止3中类型的查询

    1. 限制笛卡尔积的查询(笛卡尔积Join)。这种情况由于没有指定reduce join key,所以只会启用一个reducer,数据量大时会造成性能瓶颈

             对关系型数据库非常了解的用户可能期望在执行join查询的时候不使用on语句而是使用where语句,这样关系数据库的执行
      优化器就可以高效的将where语句转换成那个on语句。不幸的是,hive不会执行这种优化,因此,如果表足够大,那么这个查询就会
      出现不可控的情况:                                              【用where而不是join就行了】

1 // Use only 1 reducer in case of cartesian product
2     if (reduceKeys.size() == 0) {
3       numReds = 1;
4  
5       // Cartesian product is not supported in strict mode
6       if(conf.getVar(HiveConf.ConfVars.HIVEMAPREDMODE).equalsIgnoreCase("strict")) {
7         throw new SemanticException(ErrorMsg.NO_CARTESIAN_PRODUCT.getMsg());
8       }
9     }
限制笛卡儿积Join

相关文章: