Hive multiple distinct on query 运行 慢?
Hive multiple distinct on query running slow?
为什么下面的查询要花很长时间才能完成,而如果单独查询 returns 秒?
select count(*),count(distinct a), count(distinct b) from test.tablename;
但是,如果查询以下两个查询中的任何一个,它 returns 秒。
例如
select count(*),count(distinct a) from test.tablename;
或
select count(*),count(distinct b) from test.tablename;
有什么可以加快速度的吗?已经 运行 计算统计分析。配置单元配置大部分已优化。
更新:抱歉。错过了问题中的计数。
我记得 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)
。多个这样的表达式可能需要将所有数据发送到单个节点以在那里进行处理——这是一个真正的性能杀手。
如果你没有太大的计数(太大的数组会导致OOM)的替代方法。 size(collect_set())
会给你不同的计数。
select count(*), size(collect_set(a)), size(collect_set(b)) from test.tablename;
为什么下面的查询要花很长时间才能完成,而如果单独查询 returns 秒?
select count(*),count(distinct a), count(distinct b) from test.tablename;
但是,如果查询以下两个查询中的任何一个,它 returns 秒。 例如
select count(*),count(distinct a) from test.tablename;
或
select count(*),count(distinct b) from test.tablename;
有什么可以加快速度的吗?已经 运行 计算统计分析。配置单元配置大部分已优化。
更新:抱歉。错过了问题中的计数。
我记得 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)
。多个这样的表达式可能需要将所有数据发送到单个节点以在那里进行处理——这是一个真正的性能杀手。
如果你没有太大的计数(太大的数组会导致OOM)的替代方法。 size(collect_set())
会给你不同的计数。
select count(*), size(collect_set(a)), size(collect_set(b)) from test.tablename;