最近在做Hive的查询平台,需要考虑的比较多,其中一点就是对于分区表要限制用户的查询量,主要是要用户必须指定分区键.一开始的想法步子比较大就是做HQL解析,不过由于项目周期压力暂缓,这时发现了一个参数:hive.partition.pruning(https://issues.apache.org/jira/browse/HADOOP-4345)不过不能高兴的太早,CDH4.2.0的Hive并没有merge进来,不过还好有另外一个参数:hive.mapred.mode
当mode=strict时做什么项目官方文档别没看到详细的说明,看代码吧后结论如下:
最后使用这个参数,并对异常捕获进行用户提示.
1.不准对分区表不加分区键查询
if (tab.isPartitioned()) {
if ("strict".equalsIgnoreCase(HiveConf.getVar(conf,
HiveConf.ConfVars.HIVEMAPREDMODE))){
if (!hasColumnExpr(prunerExpr)){
thrownewSemanticException(ErrorMsg.NO_PARTITION_PREDICATE
.getMsg("for Alias \"" + alias + "\" Table \""
+ tab.getTableName() + "\""));
}
}
2.不准笛卡尔积
if (reduceKeys.size() ==0) {
numReds = 1;
if (conf.getVar(HiveConf.ConfVars.HIVEMAPREDMODE).equalsIgnoreCase(
"strict")){
thrownewSemanticException(ErrorMsg.NO_CARTESIAN_PRODUCT.getMsg());
}
}
3.不准order by 不加limit
if (sortExprs == null) {
sortExprs =qb.getParseInfo().getOrderByForClause(dest);
if (sortExprs != null) {
assert numReducers == 1;
Integerlimit = qb.getParseInfo().getDestLimit(dest);
if (conf.getVar(HiveConf.ConfVars.HIVEMAPREDMODE).equalsIgnoreCase(
"strict")
&& limit == null) {
thrownew SemanticException(generateErrorMessage(sortExprs,
ErrorMsg.NO_LIMIT_WITH_ORDERBY.getMsg()));
}
}
}
本文转自MIKE老毕 51CTO博客,原文链接:http://blog.51cto.com/boylook/1302067,如需转载请自行联系原作者