如何优化hive中的非平等连接?

时间:2016-07-05 10:53:05

标签: hive hiveql

我有两个表,一个是a(1000行),另一个是b(7000万行)。

starttime中有两个字段endtimea,表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%。

你有其他优化方法吗?

1 个答案:

答案 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上试一试。