我有一个流,其中需要使用事件时间窗口,水印进行聚合,并且还希望通过联接将其与其他一些数据集一起进行充实。这些丰富的数据集来自文件,并且会随机更新/添加(当说“随机”时,我的意思是它们不会定期更新/刷新)。
比方说,我的主流A具有字段(时间戳,item_id,值)。 为简便起见,假设我有1个参考数据集:B,其中包含字段(时间戳,item_id,item_name)。 在A中,对于每个项目,我每小时都会定期收到新数据。但是,B包含管理数据,因此有时一天两次更新,但有时每周一次。 要求是一旦有新数据传入A,就对A.value进行汇总,并使用B.item_name对其进行充实。
我尝试了一些方法,但都失败了:
方法1 :使用Stateful MapGroupWithState将B保持为映射数据集<<<这是不可能的,因为在写出数据时我需要“更新”模式,并且在做之前我还需要进行汇总MapGroupWithState(在MapGroupWithState之后我还没有弄清楚怎么做)
方法2 :根据时间戳从B获取最新数据,例如:
val B_latest = B.filter($"d_time" = B.agg(max("d_time")).take(1)(0).get(0))
A.join(B_latest, Seq("item_id"), "inner")
但是我得到了 AnalysisException:必须使用writeStream.start()执行带有流源的查询,我猜这是由agg_max函数引起的。
对此有什么解决办法吗?
非常感谢。