[英]Spark Structured Streaming groupByKey on a time Window not working
我需要將我的Kafka流批處理到每個10分鍾的時間窗口中,然后對其進行一些批處理。
注意:以下記錄具有時間戳字段
val records = spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", brokerPool)
.option("subscribe", topic)
.option("startingOffsets", kafkaOffset)
.load()
我使用以下命令向每個記錄添加一個時間窗口,
.withColumn("window", window($"timing", windowDuration))
我創建了一些幫助器類,例如
case class TimingWindow(
start: java.sql.Timestamp,
end: java.sql.Timestamp
)
case class RecordWithWindow(
record: MyRecord,
groupingWindow: TimingWindow
)
現在我有一個[RecordWithWindow]類型的DF
所有這些都很好。
下一個,
metricsWithWindow
.groupByKey(_.groupingWindow)
//By grouping, I get several records per time window
//resulting an object of the below type which I write out to HDFS
case class WindowWithRecords(
records: Seq[MyRecord],
window: TimingWindow
)
在我檢查HDFS的地方,
范例 :
預期 :每個WindowWithRecords對象都具有唯一的TimingWindow
WindowWithRecordsA(TimingWindowA, Seq(MyRecordA, MyRecordB, MyRecordC))
實際 :具有相同TimingWindow的多個WindowWithRecords對象
WindowWithRecordsA(TimingWindowA, Seq(MyRecordA, MyRecordB))
WindowWithRecordsB(TimingWindowA, Seq(MyRecordC))
看起來groupByKey邏輯運行不正常。
希望我的問題清楚。 任何指針都會有所幫助。
發現問題:
處理窗口時,我沒有使用顯式觸發器。 結果,Spark盡可能快地創建了微型批處理,而不是在窗口末尾進行。
streamingQuery
.writeStream
.trigger(Trigger.ProcessingTime(windowDuration))
...
.start
這是我誤解了Spark文檔的結果。
注意:groupByKey使用對象的哈希碼。 重要的是要確保對象的哈希碼是一致的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.