如何将流数据与更新缓慢的表(例如每天一次)连接?

时间:2019-12-04 19:28:23

标签: apache-spark spark-structured-streaming

在结构化流中,我需要将流数据与一些变化缓慢的数据结合在一起。变化缓慢的数据每天更新一次,并且可能不是在固定的时间更新。但是,流数据以秒为单位。如果我不想在每个微型批次中加载变化缓慢的数据,并且还希望在更新后获得最新版本的变化缓慢的数据,有没有办法做到这一点?

谢谢

2 个答案:

答案 0 :(得分:0)

我建议在流数据上使用DataStreamWriter.foreachBatch,并在需要时仅使用cacheunpersist缓慢变化的数据集。由于foreachBatch在驱动程序上工作(尽管在单独的线程上),所以它应该工作。

我认为,一种非常高级的方法是开发一个自定义数据源,该数据源将自己负责“慢速部分”。

答案 1 :(得分:0)

我尝试过了。我将单个文件的上次修改时间存储在变量中,然后进行广播,然后在foreachBatch中再次获得该时间。如果它们不同,则可以刷新缓存。然后我发现我不必广播变量。如果变量在foreachBatch之前获取值,则仍将原始值保留在foreachBatch内(对于在intelliJ中运行的本地模式)。代码如下:

var latestModified = Files.getLastModifiedTime(Paths.get("/some_file"))
var deltaTable = DeltaTable.forPath(spark, deltaPath)
var c = deltaTable.toDF.cache()
df
.writeStream
......
.foreachBatch { (df, batchId) =>
    val currentModifiedTime = Files.getLastModifiedTime(Paths.get("/some_file"))
    if (!currentModifiedTime.equals((latestModified))){
          c.unpersist()
          c = deltaTable.toDF.cache()
          latestModified = currentModifiedTime
        }
... ...