HiveQL 去重操做负载均衡
和SQL同样,HiveQL中一样支持DISTINCT操做,以下示例:ide
(1) SELECT count(DISTINCT uid) FROM log(2) SELECT ip, count(DISTINCT uid) FROM log GROUP BY ip
(3) SELECT ip, count(DISTINCT uid, uname) FROM log GROUP BY ip
(4) SELECT ip, count(DISTINCT uid), count(DISTINCT uname) FROM log GROUP BY ipui
当咱们使用Hive QL中的去重关键字DISTINCT时,须要注意的一点是:在多个列上进行的去重操做与hive环境变量hive.groupby.skewindata存在关系。当hive.groupby.skewindata=true时,hive不支持多列上的去重操做,并报错:Error in semantic analysis: DISTINCT on different columns not supported with skew in data. 注意:上面示例中的(3)不属于多列上的DISTINCT操做。Group By 语句spa
Map 端部分聚合:ip
并非全部的聚合操做都须要在 Reduce 端完成,不少聚合操做均可以先在 Map 端进行部分聚合,最后在 Reduce 端得出最终结果。it
基于 Hash参数包括:io
hive.map.aggr = true是否在 Map 端进行聚合,默认为 Truefunction
hive.groupby.mapaggr.checkinterval = 100000在 Map 端进行聚合操做的条目数目class
有数据倾斜的时候进行负载均衡变量
hive.groupby.skewindata = false当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每一个 Reduce 作部分聚合操做,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不一样的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程能够保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操做。
从上面group by语句能够看出,这个变量是用于控制负载均衡的。当数据出现倾斜时,若是该变量设置为true,那么Hive会自动进行负载均衡。
HIVE-2416
Currently when multiple distinct function is used, hive.groupby.skewindata optimization parameter shall be set false, or else an exception is raised:Error in semantic analysis: DISTINCT on different columns not supported with skew in dataSkew groupby should support multiple distinct function.