获取火花流数据集的头

时间:2021-07-26 13:25:42

标签: scala apache-spark spark-streaming databricks

一旦读入 Spark 流数据集,是否可以与它进行交互?例如,这会读取、转换和显示流数据:

var eventhub = spark.readStream
                    .format("eventhubs")
                    .options(ehConf.toMap)
                    .load()

var payload = eventhub.selectExpr("CAST(body AS STRING) as json", "enqueuedTime", "properties").select(from_json($"json", json_schema).as("data"), col("enqueuedTime"), col("properties"))

var df = payload.select(explode(payload("data")).alias("d"))

var eventDf = df.select("d.data.var1")
                ...
                .toDF()

display(eventDf)

但是下面的代码:

var test = eventDf.select("var1").head().getString(0)

导致此错误:org.apache.spark.sql.AnalysisException: Queries with streaming sources must be executed with writeStream.start();;

是否可以以这种方式与流数据集交互?我正在尝试在 forEachBatch 上组合一个与 writeStream 一起使用的函数。

我正在使用同事的代码,所以我知道如果与 microBatchOutputDf 一起工作,我只是不明白为什么它在 microBatch 函数中工作,但在我读取流时不在 databricks 中工作。


编辑: 我只是将函数包装在一个 microBatch 函数中:

def testMicroBatch(microBatchOutputDf : DataFrame, batchId : Long){
     var test = microBatchOutputDf.select("var1").head().getString(0)
}

并像平常一样用 writeStream 调用它:

val query = eventDf.writeStream
  .format("console")
  .outputMode("append")
  .foreachBatch(testMicroBatch _)
  .start()
  .awaitTermination()

我的流没有发送数据 atm 但我认为这是我需要的。

0 个答案:

没有答案