Scala 时间窗口上的Spark Structured Streaming groupByKey不工作
我需要将我的卡夫卡流批处理到每个10分钟的时间窗口中,然后对其运行一些批处理 注意:下面的记录有一个时间戳字段Scala 时间窗口上的Spark Structured Streaming groupByKey不工作,scala,apache-spark,apache-spark-sql,spark-structured-streaming,Scala,Apache Spark,Apache Spark Sql,Spark Structured Streaming,我需要将我的卡夫卡流批处理到每个10分钟的时间窗口中,然后对其运行一些批处理 注意:下面的记录有一个时间戳字段 val records = spark.readStream .format("kafka") .option("kafka.bootstrap.servers", brokerPool) .option("subscribe", topic) .option("startingOffsets", kafkaOffset)
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
所有这些都非常有效
其次,
我检查HDF时
示例:
预期:
每个WindowWithRecords对象都有一个唯一的计时窗口
WindowWithRecordsA(TimingWindowA, Seq(MyRecordA, MyRecordB, MyRecordC))
WindowWithRecordsA(TimingWindowA, Seq(MyRecordA, MyRecordB))
WindowWithRecordsB(TimingWindowA, Seq(MyRecordC))
实际:
多个WindowWithRecords对象具有相同的计时窗口
WindowWithRecordsA(TimingWindowA, Seq(MyRecordA, MyRecordB, MyRecordC))
WindowWithRecordsA(TimingWindowA, Seq(MyRecordA, MyRecordB))
WindowWithRecordsB(TimingWindowA, Seq(MyRecordC))
看起来groupByKey逻辑工作不正常
我希望我的问题是清楚的。任何指针都会有帮助。发现问题:
在处理窗口时,我没有使用显式触发器。因此,Spark正在尽可能快地创建微批次,而不是在窗口结束时创建
streamingQuery
.writeStream
.trigger(Trigger.ProcessingTime(windowDuration))
...
.start
这是因为我误解了Spark文档
注意:groupByKey使用对象的哈希代码。确保对象的哈希代码一致性非常重要。您确定3个预期元素在同一个微批中到达吗?HDFS记录不会更新,因此对于每个微批处理,它都会写入一个TimingWindowA记录,记录中包含在执行过程中到达的所有值,如果没有任何值,则不会写入记录。我不确定是否得到它,显式触发器?基本上,我添加了这个。触发器(trigger.ProcessingTime(windowDuration))这会强制同时处理整个窗口。