我有一个问题,我需要将离散(时间)事件的数据集与非重叠间隔的数据集(右端点不重叠)匹配,找到每个事件发生的间隔。一个例子:
事件数据集:
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生态系统工具更适合这样的大表到大表连接?
感谢您的帮助。