Apache spark Spark Structured Streaming foreachBatch和UPSERT(合并):持久化还是不持久化?

Apache spark Spark Structured Streaming foreachBatch和UPSERT(合并):持久化还是不持久化?,apache-spark,apache-spark-sql,spark-structured-streaming,Apache Spark,Apache Spark Sql,Spark Structured Streaming,如果使用foreachBatch在结构化流媒体中进行有状态聚合(任意)以将更新合并到增量表中,我是否应该在升级之前在foreachBatch中保留批处理数据帧 似乎不需要persist,因为我正在向单个数据接收器写入数据 另一方面,我强烈感觉不坚持会导致源代码重新扫描并触发聚合两次 有什么意见/想法吗 foreachBatch((VoidFunction2<Dataset<Row>, Long>) (batchDf, batchId) -> del

如果使用foreachBatch在结构化流媒体中进行有状态聚合(任意)以将更新合并到增量表中,我是否应该在升级之前在foreachBatch中保留批处理数据帧

似乎不需要persist,因为我正在向单个数据接收器写入数据

另一方面,我强烈感觉不坚持会导致源代码重新扫描并触发聚合两次

有什么意见/想法吗

foreachBatch((VoidFunction2<Dataset<Row>, Long>) (batchDf, batchId) -> 
        deltaTable.as("table").merge(batchDf.as("updates"), functions.expr("table.id=updates.id"))
        .whenNotMatched().insertAll()           // new session to be added
        .whenMatched()
        .updateAll()
        .execute())
foreachBatch((VoidFunction2)(batchDf,batchId)->
deltaTable.as(“table”).merge(batchDf.as(“更新”),functions.expr(“table.id=updates.id”))
.whenNotMatched().insertAll()//要添加的新会话
.whenMatched()
.updateAll()文件
.execute())

让我引用下一页:

为了避免重新计算,应该缓存输出数据帧/数据集,将其写入多个位置,然后取消缓存

我不知道你是否已经访问过这个页面,但似乎你是正确的,坚持在你的情况下是不必要的。这对于多个位置至关重要


来源:

因此delta用户()的答案是:

DeltaTable.merge(upsert)对源数据执行两次传递


因此,如果您确实关心
mapGroupsWithState
/
flatmagroupswithstate
内任意状态聚合中的Spark度量或日志,请在
foreachBatch
内合并之前进行持久化/缓存,否则发送的度量将具有两个(x2)值,并且日志聚合日志将发出两次,我看过那一页,这让我觉得坚持是不必要的。此外,在databricks笔记本中,它们不是持久的()。另一方面,如果我不坚持,我会看到任意聚合阶段的日志两次。我得出与您相同的结论,但我没有发现您仍然有重复的日志。我甚至在Spark文档中进行了检查,并在“注释”部分()中找到了可能的解释。“默认情况下,foreachBatch只提供至少一次写入保证。但是,您可以使用提供给函数的batchId作为消除输出重复并获得一次保证的方法。”基本上,他们说您以前做什么都不重要,使用batchId并自行执行重复数据消除您能详细说明或参考一些使用batchId和foreachBatch进行重复数据消除的示例吗?这个答案应该比我更能涵盖这一部分