Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:联接两个表以查找子集中的第一个匹配记录_Sql_Apache Spark Sql - Fatal编程技术网

SQL:联接两个表以查找子集中的第一个匹配记录

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

我有包含请求/响应消息的数据。我把它分成了两张桌子。表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.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