Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 时间窗口上的Spark Structured Streaming groupByKey不工作_Scala_Apache Spark_Apache Spark Sql_Spark Structured Streaming - Fatal编程技术网

Scala 时间窗口上的Spark Structured Streaming groupByKey不工作

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)

我需要将我的卡夫卡流批处理到每个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

所有这些都非常有效

其次,

我检查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))这会强制同时处理整个窗口。