Spark MapGroupsWithState更新功能不允许执行操作查询,例如过滤器,计数,显示等

时间:2019-06-07 12:16:21

标签: scala apache-spark apache-spark-sql spark-streaming

我有一个IoT应用程序,可以从不同的电表和逆变器表接收数据。这些电表会连续发送电表值,而不是消耗的单位数。该值在一段时间内不断增加,我必须计算每米的一小时能耗。

我在kafka主题中获得了所有这些数据,并从中创建了结构化流数据框架。

在此扩展的数据框上,我正在应用mapGroupsWithState函数。这应该使我返回一个小时的时间。

问题: 我无法使用spark数据框在更新功能内执行任何计数,显示,过滤,聚合操作。

    val df_output = final_df
      .selectExpr("*")
      .as[input_row_druid]
      .groupByKey(_.plant_slug)
      .mapGroupsWithState(GroupStateTimeout.ProcessingTimeTimeout)(updateAcrossEvents)
      .writeStream
      .format("console")
      .outputMode("update")
      .start()

    df_output.awaitTermination()


  def updateAcrossEvents(plant_slug:String, inputs: Iterator[input_row_druid],
                         oldState: GroupState[source_state]):out_state = {
    val spark_session = SparkSession.builder().getOrCreate()
    import spark_session.implicits._

    val list_of_list = inputs.toList
    val new_df = list_of_list.toDF
    var my_state:source_state = if (oldState.exists) oldState.get else source_state(plant_slug,list_of_list)

    println("Printing inverter and merter df with counts")
    val inverter_df = new_df.filter($"device_type" === "INVERTER")
    val meter_df = new_df.filter($"device_type" === "METER")
    println(inverter_df.show())
    val inv_count = inverter_df.count()
    println(meter_df.show())
    val meter_count = meter_df.count()
    println(inv_count)
    println(meter_count)

    val new_state = source_state(plant_slug, list_of_list)
    oldState.update(new_state)
    var out = out_state(plant_slug,inv_count.toString,meter_count.toString)
    out
  }

如果我不执行任何过滤操作,则new_df.show将打印数据帧中的所有数据。但是计数,显示,过滤器不起作用。

我注意到的一件事是,每当我提交作业以激发它以多个批次运行时,批次0总是成功的,但是它挂在批次0上。它永远不会在下一个批次中进行。

这是预期的结果

+--------------------+-------+---------+
|          plant_slug|inv_gen|meter_gen|
+--------------------+-------+---------+
|              plant1|     11|       10|
|              plant2|     20|       19|
|              plant3|     40|       38|
|              plant4|     59|       57|
|              plant5|     37|       35|
+--------------------+-------+---------+

0 个答案:

没有答案