为什么hive 多个 distinct的查询运行缓慢?

jobtbby3  于 2021-04-03  发布在  Hive
关注(0)|答案(2)|浏览(666)

为什么下面的查询要花很长时间才能完成,而如果单独查询的话,几秒钟内就会返回?

select count(*),count(distinct a), count(distinct b) from test.tablename;

然而,如果查询下面两个查询中的任何一个,它都会以秒为单位返回,例如:

select count(*),count(distinct a) from test.tablename;

或者

select count(*),count(distinct b) from test.tablename;

hive的配置大部分都是优化的。
更新:抱歉。错过了问题中的数。

0lvr5msh

0lvr5msh1#

如果你没有太大的计数(太大的数组会导致oom),可以采用另一种方法。 size(collect_set())会给你一个明确的计数。

select count(*), size(collect_set(a)), size(collect_set(b)) from test.tablename;
zazmityj

zazmityj2#

我记得hive在实现 "count(distinct) "方面做得很差,是不是这样更快?

select (select count(*) from test.tablename),
       (select count(*) from (select a from test.tablename group by a) x),
       (select count(*) from (select b from test.tablename group by b) x)

如果你的a和b的值相对较少,那么这可能也有不错的性能。

select sum(cnt),
       sum(case when seqnum_a = 1 then 1 else 0 end),
       sum(case when seqnum_b = 1 then 1 else 0 end)
from (select a, b, count(*) as cnt,
             row_number() over (partition by a order by a) as seqnum_a,
             row_number() over (partition by b order by b) as seqnum_b
      from test.tablename
      group by a, b
     ) ab;

hive是一个并行数据库,但有些操作是在一个处理器上进行的。曾经,"count(distinct) "是这些操作之一。然而,这可能已经被修正了。......如果查询中只有一个count(distinct),那么多个这样的表达式可能需要将所有的数据发送到一个单一的节点上进行处理--这是一个真正的性能杀手。

相关问题