如何减少来自kafka的spark数据框并收集结果?

时间:2019-07-20 07:44:26

标签: scala apache-spark apache-kafka reduce

我有一个从kafka流创建的数据框。我想将其减小为单个值,然后在程序中使用该单个值。

```scala
import sparkSession.implicits._
val df = sparkSession
  .readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", ...)
  .option("subscribe", "theTopic")
  .load()

val result = df
  .selectExpr("CAST(value AS STRING) as json")
  .map(json => getAnInt(json))
  .reduce { (x, y) =>
    if (x > y) x else y
  }



 someOtherFunction(result)
 ```

我希望将流减少为一个值,然后可以在程序的其余部分中使用它。相反,它失败并显示:

  

org.apache.spark.sql.AnalysisException:具有流源的查询必须使用writeStream.start();执行;   卡夫卡       在org.apache.spark.sql.catalyst.analysis.UnsupportedOperationChecker $ .throwError(UnsupportedOperationChecker.scala:389)       在org.apache.spark.sql.catalyst.analysis.U ...

1 个答案:

答案 0 :(得分:1)

您只能在流数据帧上使用writeStream。我不确定您是否打算使用此流数据框架。如果删除readStream并改用read,则可以解决此问题!