Apache spark ForeachWriter在Spark结构化流媒体中的用途是什么?

Apache spark ForeachWriter在Spark结构化流媒体中的用途是什么?,apache-spark,spark-structured-streaming,Apache Spark,Spark Structured Streaming,有人能解释一下foreach writer对spark结构化流媒体的需求吗 由于我们以数据帧的形式获取所有源数据,因此我不打算使用foreachwriter 数据帧是一个抽象的Spark概念,它不会直接映射为可操作的格式,例如写入控制台或数据库 通过创建ForeachWriter,您将获取数据帧的行或批,并定义如何打开要写入的目标系统,如何处理该事件,然后最终关闭打开的资源 以JDBC数据库为例,您可以在open中建立一个数据库会话,也许还可以定义一个PreparedStatement,它映射到

有人能解释一下foreach writer对spark结构化流媒体的需求吗


由于我们以数据帧的形式获取所有源数据,因此我不打算使用foreachwriter

数据帧是一个抽象的Spark概念,它不会直接映射为可操作的格式,例如写入控制台或数据库

通过创建ForeachWriter,您将获取数据帧的行或批,并定义如何打开要写入的目标系统,如何处理该事件,然后最终关闭打开的资源

以JDBC数据库为例,您可以在open中建立一个数据库会话,也许还可以定义一个PreparedStatement,它映射到您想要添加的数据,然后您可以处理一些泛型类型T来执行任何您想要的操作,比如将一些字段绑定到语句。最后,完成后,关闭数据库连接

在向控制台写入数据的情况下,实际上没有什么需要打开或关闭的,但是您需要将数据帧的每个字段串起来,然后打印出来

我觉得用例很好,基本上就是说,对于任何不提供writeStream.formatx数据写入方式的系统,那么您需要自己实现这个类,以便将数据导入下游系统


或者,如果需要写入多个目的地,可以在写入两个位置之前缓存数据帧,这样数据帧就不需要重新计算,从而导致spark structured streaming df中目的地之间的数据不一致。writeStream目前不支持像Jdbc这样的许多存储,Hbase等这是ForeachWriter的主要用例,ForeachWriter将允许您编写连接创建和保存逻辑,以便您可以将流式数据保存到任何数据存储。另一个用例是当您想要添加自定义逻辑时&而不仅仅是保存。有关更多详细信息,请参阅文件


如果您正在考虑df.write,结构化流式数据帧数据会不断更新,因此df.write选项将被排除,因为它仅适用于批处理数据帧,在流式数据帧情况下不受支持。

ForeachWriter是否具有多个连接以写入多个位置?例如,在同一个ForeachWriter中向JDBC和HBase写入数据帧。因为Spark 2.3不支持缓存数据帧,我不想重新计算数据帧。是的。每个DataRicks文档的多个位置模式如下:streamingDF.writeStream.foreachBatch{batchDF:DataFrame,batchId:Long=>batchDF.persist batchDF.write.format….保存…//位置1 batchDF.write.format….保存…//位置2 batchDF.unpersist}了解更多信息,请参阅本文的“写入多个位置”一节:这不是使用相同的ForEachWriter这是forEachBatch,它没有显示为DataStream之外的任何方法。现在它已经消失了吗?为了forEach?事实上,我更喜欢forEachBatch.@Chris Bedford,你的说法没有错,但对于liveisshort的问题来说并不正确。spark 2.3不支持foreachbatchwriter,它仅在spark 2.4+中可用。