我正在尝试编写一个代码,该代码首先进行连接,然后进行聚合(groupby和count)。
我希望聚合阶段的输出可更新。下面是我使用的代码:
val spark = SparkSession.builder().master("local").getOrCreate()
import spark.implicits._
val df = spark.readStream.format("kafka")
.option("kafka.bootstrap.servers", "localhost:9092")
.option("subscribe", "testerIn")
.load().selectExpr("CAST(value AS STRING)").as[String]
val interimDF = df.join(df,"value")
val newDF = interimDF.groupBy("value").count().toJSON
newDF.writeStream.format("kafka").outputMode("update") .option("kafka.bootstrap.servers", "localhost:9092") . option("checkpointLocation","/path/to/directory")
.option("topic", "tester").start()
spark.streams.awaitAnyTermination()
此代码引发错误,因为spark中的流流连接不支持更新模式:
Exception in thread "main" org.apache.spark.sql.AnalysisException: Inner join between two streaming DataFrames/Datasets is not supported in Update output mode, only in Append output mode;;
现在,我完全理解为什么Spark在我们加入时会引发此错误;更新模式几乎没有任何意义(因为只要有新行输入,我们就会在输出中得到新行,因此追加)。
如果我要在追加(interimDF)后以追加模式将数据帧输出到Kafka,然后从中读取数据并执行聚合阶段(newDF),然后以更新模式将其写回到其他流中,那么我的问题是解决了。那正是我想要做的,但是我想避免在中间写卡夫卡舞台。有什么办法可能吗?我也愿意接受骇客式解决方案或指向某人就类似内容提出的拉取请求的链接。