老铁不可能这么多count的,要么统计行,要么统计其中一个。这么多count不符合逻辑。
由于有count,因此默认是有一个reducer的,这样效率就会很慢,所以可以使用分组分别统计。
如果你想统计,是不能用a来进行分组的。可以自己制作一个flag来分组。
count由于只有一个reduce来统计。因此如果不优化会非常的慢。那么怎么优化那?
既然整个只产生一个reduce,那么我们就把他们分别统计,然后在统计。那么如何实现分别统计,通过group by分组。那么分组不能按照被统计的分组。可以制造一个flag,来进行分组。
首先我们第一层:
select cast(rand() * 10 as bigint) flag,A from tablename group by A
我们记为表t1
1层使用随机数作为分组依据,同时使用group by A保证去重。
第二层,每个分组进行统计
select count(*) tc, tag from t1 group by tag
上面记为t2
第三层对分组结果求和。
SELECT SUM(tc) FROM t2
整合为一个sql为:
SELECT SUM(tc) FROM (select count(*) tc, tag from (select cast(rand() * 10 as bigint) flag,A from tablename group by A )t1 group by tag )t2;
|