我有一个问题,需要将离散(时间上)事件的数据集与不重叠时间间隔(右端点不重叠)的数据集相匹配,找出每个事件发生的时间间隔。举个例子:
事件数据集:
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生态系统工具更适合这样的大表到大表连接?
谢谢你的帮助。
暂无答案!
目前还没有任何答案,快来回答吧!