我有一个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|
+--------------------+-------+---------+