在Spark上使用Hive完全外部加入:如何优化或其他替代方案

时间:2016-03-29 15:40:30

标签: join apache-spark hive apache-spark-sql spark-dataframe

我有一个问题,我需要将离散(时间)事件的数据集与非重叠间隔的数据集(右端点不重叠)匹配,找到每个事件发生的间隔。一个例子:

事件数据集:

event  timestamp
a      1
b      5
c      10

间隔数据集:

interval  start  end
a         0      2
b         2      3
c         3      6
d         6      10
e         10     11

理想情况下,我会在hiveQL(最终我在这里使用Spark)中这样做:

select a.*, b.interval
from event a
left outer join 
interval b
on a.t >= b.start and a.t <= b.end

但是hive不支持非等值连接(但是火花SQL确实???,有没有办法指定在HiveContext sqlContext = new HiveContext(sc);之后使用哪个)所以我做了类似的事情:< / p>

select a.*, b.interval
from event a
full outer join 
interval b
where a.t >= b.start and a.t <= b.end

我没有专家知道Spark上的Hive是如何工作的,但是我使用的这种策略看起来非常慢(这是一个玩具示例,我实际上有几TB的数据)。事件和间隔都是非常大的表,尽管间隔通常要大几倍。我考虑过其他一些策略:

(1)插入到区间数据集中的每个可能的时间戳,如下所示:

interval start
a        0
a        1
b        2
c        3
c        4
c        5
...

这样我就可以使用on a.timestamp = b.start作为连接条件。我不知道这是否会更有效率。

(2)两个数据集+间隙和岛屿的联合填补:

我还考虑过是否采用这两个数据集的联合,创建这样的东西(让我们称之为tblu):

type     event  interval  timestamp   start  end
interval NA     a         NA          0      2
event    a      NA        1           NA     NA
interval NA     b         NA          2      3
interval NA     c         NA          3      6
event    b      NA        5           NA     NA

然后做类似的事情:

select a.*, 
(case when a.end < a.timestamp then NA else b.interval end) as interval 
from (
select event, timestamp, max(start) as start, max(end) as end from ( 
    select *, 
        sum(case when type = 'event' then 0 else 1 end) over (order by coalesce(start, timestamp)) as group
    from tblu
) i
group by event, timestamp ) a
left outer join 
interval b

获取每个事件的间隔。

我希望有人可以a)提供一些有关我当前实施速度如此之慢的原因。我有一些想法,即完全连接会导致操作受到内存限制,并且它会在节点之间产生大量的混乱,但我并不完全确定。我还想知道是否有b)方法可以加速我当前的实施,而不是更大更多的机器。最后,如果有人对c)执行此操作的替代方法有任何想法,并且我的任何其他想法都是好的,我最感兴趣。有没有其他的hadoop生态系统工具更适合这样的大表到大表连接?

感谢您的帮助。

0 个答案:

没有答案