我有两个表,一个是a
(1000行),另一个是b
(7000万行)。
表starttime
中有两个字段endtime
,a
,表time
中有一个字段b
。
我使用 mapjoin 来查询:
select /*+ MAPJOIN(a) */ a.starttime,a.endtime, b.time
from a join b
where b.time between a.starttime and a.endtime;
但执行速度非常慢。 mapreduce工作总是保持在0%。
你有其他优化方法吗?
答案 0 :(得分:0)
一种方法就是将a
扩展为每天都有一行。
另一种方法是使用交错技术。这假设a
确实划分时间,因此没有重叠或间隙。而且,b
有一个主键。
因此,对于id
中的每个b
,您可以在a
中获得相应的开始时间:
select id, time, max(starttime) over (order by time, priority) as a_starttime
from ((select b.id, b.time, null as starttime, 2j as priority from b) union all
(select null, a.starttime, a.starttime, 1 as priority from a)
) ab;
然后你可以用equijoin:
select id, time, a.starttime, a.endtime
from (select id, time, max(starttime) over (order by time, priority) as a_starttime
from ((select b.id, b.time, null as starttime, 2j as priority from b) union all
(select null, a.starttime, a.starttime, 1 as priority from a)
) ab
) ab join
a
on ab.a_starttime = a.starttime;
注意:此技术在其他数据库上运行良好。我没有机会在Hive上试一试。