前话:
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 }