我想在groupBy上运行UDAF,该操作将由每个键的所有值组成,可以回顾24小时从键的最新事件时间开始。这24小时的参数是可配置的。 / p>
注意:我无法运行Spark Window分析函数,因为它在每一行的框架上运行,这会导致严重的性能问题。这不是移动窗口的问题!!!
我尝试使用Spark Window(与Spark Window Analytic不同),代码如下所示。对于窗口时间段,它稍微有点错误(请参阅输出)
val windowDF = customerDF.groupBy(col("key"),
window($"session_end_tm",
"24 hours"))
.count
这是我的示例代码。
val customer = Seq(
("101", 120000.00, 0.00, "2018-01-23 01:23:16"),
("101", 410500.00, 500.00, "2018-01-23 01:26:2"),
("101", 200.00, 200.00, "2018-01-23 13:07:31"),
("101", 410500.00, 0.0, "2018-01-23 18:38:21"),
("101", 500.00, 0.0, "2018-01-23 19:32:59")
)
val customerDF = customer.toDF("key", "val_1", "val_2", "session_end_tm")
val windowDF = customerDF.groupBy(col("key"), window($"session_end_tm", "24 hours")).count
实际输出
上面代码中的结果数据框
windowDF.show(false)
+---+------------------------------------------+-----+
|key|window |count|
+---+------------------------------------------+-----+
|101|[2018-01-23 19:00:00, 2018-01-24 19:00:00]|1 |
|101|[2018-01-22 19:00:00, 2018-01-23 19:00:00]|4 |
+---+------------------------------------------+-----+
预期输出
我对上面的代码有什么期望
+---+------------------------------------------+-----+
|key|window |count|
+---+------------------------------------------+-----+
|101|[2018-01-22 20:00:00, 2018-01-23 20:00:00]|5 |
+---+------------------------------------------+-----+
注意:如开头所述,实际结果将是在UDAF上运行的多个聚合列,而不是简单的“ count”列。