在结构化流中,我需要将流数据与一些变化缓慢的数据结合在一起。变化缓慢的数据每天更新一次,并且可能不是在固定的时间更新。但是,流数据以秒为单位。如果我不想在每个微型批次中加载变化缓慢的数据,并且还希望在更新后获得最新版本的变化缓慢的数据,有没有办法做到这一点?
谢谢
答案 0 :(得分:0)
我建议在流数据上使用DataStreamWriter.foreachBatch,并在需要时仅使用cache和unpersist缓慢变化的数据集。由于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
}
... ...