我正在使用水印将两个流连接在一起,如下所示:
val order_wm = order_details.withWatermark("tstamp_trans", "20 seconds")
val invoice_wm = invoice_details.withWatermark("tstamp_trans", "20 seconds")
val join_df = order_wm
.join(invoice_wm, order_wm.col("s_order_id") === invoice_wm.col("order_id"))
根据我对上述代码的理解,它将使每个流保持20秒。之后,但是,当我现在提供一个视频流,而在20秒之后提供另一个视频流时,两个视频流也将加入。似乎甚至在水印完成后,Spark仍将数据保存在内存中。 45秒后我什至尝试了,而且也加入了。
这使我对水印感到困惑。
答案 0 :(得分:0)
它来了,但是,当我现在给一个视频流并且20秒后给另一个视频流时,两个视频流也都加入了。
这是可能的,因为测量的时间不是事件到达的时间,而是水印字段内的时间,即tstamp_trans
。您必须确保tstamp_trans
中的最后一次是在参加联接的行之后20秒。
答案 1 :(得分:0)
换句话说,您将必须在连接中执行以下附加步骤。
定义两个输入上的水印延迟,以便引擎知道输入的延迟程度(类似于流聚合)
定义两个输入之间的事件时间约束,以便引擎可以确定何时不需要与另一个输入匹配的一个输入的旧行(即不满足时间约束)。可以通过两种方式之一来定义此约束。
时间范围加入条件(例如...在rightTime和rightTime之间加上JOINT ON leftTime和rightTime +间隔1小时),
加入事件时间窗口(例如... JOIN ON leftTimeWindow = rightTimeWindow)。