簡體   English   中英

Spark Structured Streaming 在帶有 Trigger.Once 的 Databricks 上顯示沒有 output

[英]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 限制? 錯誤?

  • 這種處理模式不能在一個單元格中運行嗎?
  • 音量問題?
  • 這就引出了一個問題,Trigger Once 是否只能在 Databricks 環境中使用? 我假設我可以在 Linux 下將其作為 jar 運行。

這可能是一個錯誤,這里是:

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM