Spark结构化流中ForeachWriter的目的是什么?

时间:2018-12-28 22:34:28

标签: apache-spark spark-structured-streaming

有人可以解释Spark结构化流上foreach writer的需求吗?

当我们以dataFrame的形式获取所有源数据时,我没有使用foreachwriter。

2 个答案:

答案 0 :(得分:4)

DataFrame是Spark的抽象概念,不会直接映射为可以执行的格式,例如写入控制台或数据库。

通过创建ForeachWriter,您将获取DataFrame的行(或批次),并定义如何open()要写入的目标系统,如何{{1} }该事件,然后最后process()打开资源。

以JDBC数据库为例,您将在close()中建立一个数据库会话,并可能定义一个open()映射到要添加的数据,然后可以PreparedStatement一些通用类型process()来执行所需的任何操作,例如将某些字段绑定到该语句。最后,完成后,关闭数据库连接。

在写入控制台的情况下,实际上并没有打开或关闭的东西,但是您需要T DataFrame的每个字段,然后打印它


我觉得用例很好laid out in the documentation,基本上是说对于任何不提供toString写数据方式的系统,那么您都需要实现对自己进行分类,以将数据输入下游系统。

或者,如果您需要写入多个目标,则可以在写入两个位置之前先缓存数据框,这样就无需重新计算该数据框,从而导致目标之间的数据不一致

答案 1 :(得分:0)

在火花结构化流中,当前许多商店(例如Jdbc,Hbase等)都不支持df.writeStream,这是ForeachWriter的主要用例,ForeachWriter将允许您编写用于创建和保存连接的逻辑,以便您可以保存流数据到任何数据存储。另一个用例是您要添加自定义逻辑而不仅仅是保存。有关更多详细信息,请参阅文档https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#using-foreach-and-foreachbatch

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