SQL:联接两个表以查找子集中的第一个匹配记录
我有包含请求/响应消息的数据。我把它分成了两张桌子。表t1包含所有请求,t2包含所有响应。 Frame表示帧编号,time表示时间戳。现在我需要将请求映射到相应的响应消息 这是我目前的查询,它按预期工作SQL:联接两个表以查找子集中的第一个匹配记录,sql,apache-spark-sql,Sql,Apache Spark Sql,我有包含请求/响应消息的数据。我把它分成了两张桌子。表t1包含所有请求,t2包含所有响应。 Frame表示帧编号,time表示时间戳。现在我需要将请求映射到相应的响应消息 这是我目前的查询,它按预期工作 SELECT t1.frame as frame1, min(t2.frame) as frame2, t1.key, (min(t2.time)-t1.time) as delta FROM t1 JOIN t2 ON t2.frame > t1.frame and t2.ke
SELECT t1.frame as frame1, min(t2.frame) as frame2, t1.key,
(min(t2.time)-t1.time) as delta
FROM t1
JOIN t2
ON t2.frame > t1.frame and
t2.key LIKE CONCAT('%', t1.key, '%')
GROUP BY t1.frame, t1.time, t1.key
ORDER BY t1.frame
我在这里所做的是,对于来自t1请求消息的每个记录,在t2响应消息中查找第一个记录,它位于基于时间戳的t1记录之后,并且t1中的键存在于t2中。然后得到这两条记录之间的时间差。
现在它正在做它应该做的事情。但我的问题是,在某些情况下,可能会缺少响应,这正是我想要在测量响应时间的同时捕捉到的。因此,可能会发生以下情况:
1) Request for ID1<---
2) <No Response for ID1>
3) Request for ID1<---
4) Response for ID1-->
HTH在通用SQL中,这可以通过左连接实现 和反联接不存在运算符以及相关子查询, 但我不知道Spark SQL是否支持它们 演示:
如果由于超时或其他原因导致某些请求没有响应怎么办?例如,发送了4个具有相同ID的请求,但只收到了2个针对这些请求的响应?我不确定我是否完全理解了您的问题。这些消息是两个组件之间的内部消息。对于一个特定ID,只有1个未完成的“事务”。因此不会出现4条请求消息的情况。因此,由于没有响应或响应延迟,在第一次请求超时之前,第二次请求无法进入。谢谢。你能展示一些样本数据和预期的结果吗?谢谢。我将尝试这个。得到以下错误。Spark SQL中似乎不支持它:谓词子查询只能在筛选器中使用:“Join LeftOuter,frame_number25777>frame_Number2147&&L1_FAPI_dlDCIPduInfo_st_rnti26194,如concat%、L1_FAPI_Sruduindication_st_rnti22410、%&&NOT exists25772。我仍然有办法检测这个案例,因为该列包含重复的条目。不过,如果我第一次能够正确生成结果,那就太好了。我会标记答案,因为它符合我的要求。不幸的是,Spark SQL似乎不支持它。谢谢您的帮助@krokodilko.BTW,我不明白SELECT 5的功能。你能解释一下吗?谢谢。我找到了这个。现在,我们不支持嵌套的IN/EXISTS子查询,例如EXISTS x1或EXISTS x2。为了做到这一点,我们可以使用一个只包含内部的联接类型SemiPlus,它将从左侧输出每一行,并作为联接条件的结果输出额外的列。然后我们可以用result列替换EXISTS或IN。
t1:
frame, Time, Key
1 2.3 0x01
4 3.5 0x02
13 4.6 0x03
22 6.2 0x03
t2:
frame, Time, Key
3 2.5 0x01
8 3.8 0x02
25 6.3 0x03
Expected Result:
t1.frame, t2.frame, delta, key
1 3 0.2 0x01
4 8 0.3 0x02
13 null null null
22 25 0.1 0x03
SELECT t1.frame as frame1, min(t2.frame) as frame2, t1.key,
(min(t2.time)-t1.time) as delta
FROM t1
LEFT JOIN t2
ON t2.frame > t1.frame
and t2.key LIKE CONCAT('%', t1.key, '%')
and NOT EXISTS (
SELECT 5 FROM t1 t11
WHERE t11.key = t1.key
AND t11.time > t1.time
AND t11.time < t2.time
)
GROUP BY t1.frame, t1.time, t1.key
ORDER BY t1.frame