在spark上使用hive的完全外部连接:如何优化或其他替代方案

eulz3vhy  于 2021-06-26  发布在  Hive
关注(0)|答案(0)|浏览(185)

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

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不支持非equijoin(但是sparksql支持??),有没有一种方法可以指定之后使用哪个 HiveContext sqlContext = new HiveContext(sc); )所以我在做这样的事情:

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

我不是spark上Hive的Maven,但是我使用的这个策略看起来慢得让人望而却步(这是一个玩具示例,我实际上有好几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)提供一些关于为什么我当前的实现如此缓慢的见解。我有一些想法,即完全连接会导致操作受到内存限制,并且会在节点之间创建大量的洗牌,但我不太确定。我还想知道,除了让机器越来越大之外,是否还有其他方法可以加速我目前的实现。最后,我最感兴趣的是,是否有人对c)执行此操作的其他方法有任何想法,以及我的其他想法是否是好的。有没有其他hadoop生态系统工具更适合这样的大表到大表连接?
谢谢你的帮助。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题