Spark Streaming Left将快速移动的数据与缓慢移动的右侧数据连接在一起,但不会减慢左侧输出的速度

时间:2019-05-17 15:04:00

标签: apache-spark spark-structured-streaming

我的火花工作有两个流程。假设我有一个消息“ A”,它每5分钟出现一次,而消息“ B”则是每6小时出现一次,但总是在开始时出现,这是在消息B开始为特定的公共密钥启动之前(不保证总是来,有时永远不会来)。

消息B的流上的数据具有一个字段,我需要查询该字段并将其添加到所有快速移动的消息A的字段中。消息A和B具有一个公共密钥,该密钥用于查找与特定消息A一起出现的正确消息B。我们使用Kafka作为火花作业的来源。

我真的很想查询消息B的流以获取该列,并使用.withColumn()将流B中的该字段添加到相关消息A的字段中。然后立即写出“丰富”的消息A,而没有滞留或水印滞后。我无法将其与自定义UDF一起使用。

我走了使用左联接的道路,但出现了一些错误。

不支持两个流数据帧/数据集之间的流外部联接,而联接键中没有水印,或者在可为空的一侧没有水印并且没有适当的范围条件;

我添加了这个


        val joinExpr =
      expr("""
      truckId= tripTruckId AND
      processingtimestamp >= associatetimestamp AND
      processingtimestamp <= associatetimestamp + interval 1 minutes
      """
      )

    val truckTripStatus = truckStatus
      .join(tripStatusWithTimestamp,$"truckId" === $"tripTruckId", "leftouter")
      .selectExpr("CAST(truckId AS STRING) AS key", "to_json(struct(*)) AS value")

,但错误仍然存​​在。什么是“加入键中的水印”?

消息B需要在无限制的表中停留5天。将消息A写出到kafka输出主题后,应从流表中删除快速消息A。

我认为spark希望我在缓慢移动的消息B上添加水印(这是左联接的可空面)。这样一来,spark将等到水印周期过去后再为消息A写入数据。嗯,那是5天...所以无法满足我的需求。

我的要求是当所有消息a到达火花流时立即写出所有消息,如果它们具有来自流B的相关行,则从相关消息B中获取该字段并将其添加到消息A中,然后将其写出,但是刻不容缓。我需要所有消息B保留5天,或者直到具有相同密钥的新消息B覆盖以前的所有消息为止。

当最新消息加水印时间+水印延迟超过任何旧消息的时间时,非窗口流上的水印是否会在输入点上删除/删除输入表中的较早准时到达的数据?

0 个答案:

没有答案