Apache spark Spark结构化流媒体中如何将流数据帧写入多个接收器

Apache spark Spark结构化流媒体中如何将流数据帧写入多个接收器,apache-spark,spark-structured-streaming,Apache Spark,Spark Structured Streaming,我有一组SQL规则,需要在foreachBatch()中的流数据帧上应用这些规则。应用这些规则后,结果/过滤数据帧应写入多个目的地,如“delta”和“cosmos DB” 以下是我尝试过的: 使用来自forEachBatch()方法的静态数据帧,我试图创建一个临时视图,如下所示 df.writeStream .format("delta") .foreachBatch(writeToDelta _) .outputMode("update")

我有一组SQL规则,需要在
foreachBatch()
中的流数据帧上应用这些规则。应用这些规则后,结果/过滤数据帧应写入多个目的地,如“delta”和“cosmos DB”

以下是我尝试过的: 使用来自
forEachBatch()
方法的静态数据帧,我试图创建一个临时视图,如下所示

df.writeStream
  .format("delta")
  .foreachBatch(writeToDelta _)
  .outputMode("update")
  .start()

def upsertToDelta(microBatchOutputDF: DataFrame, batchId: Long) {
    microBatchOutputDF.createOrReplaceTempView("testTable")
}
但在运行代码时,未找到显示为表或视图“testTable”的代码

是否可以在spark结构化流媒体中使用静态数据帧创建临时表/视图


或者如何向多个接收器写入?

来自澄清OPs问题的评论:

“我有一组SQL规则,需要在forEachBatch()中的数据帧上应用这些规则。应用这些规则后,生成的/过滤的数据帧将被写入多个目标,如delta和cosmos DB。”

允许您

  • 重用现有批处理数据源
  • 写入多个位置
在您的情况下,我知道您希望对流数据帧应用不同的转换,并将其写入多个位置。您可以按如下方式进行操作:

df.writeStream.foreachBatch{(batchDF:DataFrame,batchId:Long)=>
//保持数据帧,以防重复使用多次
batchDF.persist()
//使用'selectExpr'或仅使用DataFrameAPI应用SQL逻辑
val deltaBatchDf=batchDF.selectExpr(“”)
val cosmosBatchDf=batchDF.selectExpr(“”)
//像批处理数据帧一样写入多个接收器
//如果需要,添加更多位置
deltaBatchDf.write.format(“delta”).options(…).save(…)
COSMOSBATCDF.write.format(“cosmos”).options(…).save(…)
//空闲内存
batchDF.unpersist()
}

谢谢你的建议,迈克。请尝试从已创建的临时表中查询数据,好吗?表创建并没有引发任何异常,但当我尝试从该表查询数据时,它引发了“未找到表或视图”的错误Hi@Mike,当然!我有一组SQL规则,需要应用于forEachBatch()中的数据帧。应用规则后,结果/过滤数据帧将写入多个目的地,如delta和cosmos DB。