[英]Spark Structured Streaming shows no output on Databricks with Trigger.Once
我在筆記本的 Databricks CE 上運行它,它生成 output 到增量表。 我正在使用
.format("rate")
方法。val streamingQuery = aggregatesDF.writeStream.format("delta").foreachBatch(upsertToDelta _).outputMode("update").start()
但是,運行此程序不會產生 output,它會在一次調用后停止。 但桌子仍然是空的。
原因是?
確定不是 CE 限制? 錯誤?
這可能是一個錯誤,這里是:
import org.apache.spark.sql.streaming.Trigger val streamingQuery = aggregatesDF.writeStream.trigger(Trigger.Once()).format("delta").foreachBatch(upsertToDelta _).outputMode("update").start()
.format("rate")
,這可能是問題嗎? 這對於原型設計很方便。
Trigger.Once
不僅限於 Databricks - 它是 Spark Structured Streaming 的標准功能。 但問題是它需要一個具有歷史記錄的數據源,因為它觸發了自上次執行以來的數據處理,而rate
源沒有歷史記錄,總是從頭開始。 很容易展示:
df = spark.readStream.format("rate").load()
df.writeStream.trigger(once=True).option("checkpointLocation", "1.cp") \
.outputMode("append").save("1.parquet")
spark.read.parquet("1.parquet").show()
+---------+-----+
|timestamp|value|
+---------+-----+
+---------+-----+
如果您想繼續使用rate
進行實驗,最好創建一個附加表,作為rate
和您的代碼之間的緩沖區。 像這樣的東西:
# Create a buffer table
df = spark.readStream.format("rate").load()
df.writeStream.trigger(once=True).option("checkpointLocation", "buffer.cp") \
.format("delta").outputMode("append").save("1.delta")
# Use buffer table
bufferDF = spark.read.stream.format("delta").load("1.delta")
aggregatesDF = bufferDF....
streamingQuery = aggregatesDF.writeStream
.trigger(once=True)
.foreachBatch(upsertToDelta _)
.outputMode("update")
.start()
PS 將.format("delta")
與.foreachBatch
一起使用是沒有意義的——后者優先。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.