一旦读入 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 但我认为这是我需要的。