Scala 基于时间戳值连接数据帧行
我有一个带有文本消息的数据框和每行的时间戳值。 像这样: 我需要通过创建X分钟数的时间窗口来连接消息,例如,它们如下所示:Scala 基于时间戳值连接数据帧行,scala,apache-spark,Scala,Apache Spark,我有一个带有文本消息的数据框和每行的时间戳值。 像这样: 我需要通过创建X分钟数的时间窗口来连接消息,例如,它们如下所示: +---------------------------------------------------+ | message | +---------------------------------------------------+ | some text from message 1
+---------------------------------------------------+
| message |
+---------------------------------------------------+
| some text from message 1 some text from message 2 |
+---------------------------------------------------+
| some text from message 3 |
+---------------------------------------------------+
在进行连接之后,我对timestamp列没有任何用处,因此我可以删除它或将其保留为任何值
我已经能够通过迭代整个数据帧、添加时间戳差异并在时间窗口达到时插入新的数据帧来实现这一点。它可以工作,但很难看,我正在寻找一些关于如何在Scala中以更实用/优雅的方式实现这一点的建议
我查看了窗口功能,但由于我没有进行聚合,因此在创建WindowSpec后,我似乎没有办法访问组的内容,所以我没有走多远
我还研究了超前和滞后函数,但如果不进入for循环,我就不知道如何使用它们
我很感激你能提供的任何想法或建议
您可以使用(不要与函数混淆)生成时间窗口,然后使用groupBy
使用concat\ws
聚合消息:
import org.apache.spark.sql.functions._
import spark.implicits._
val df = Seq(
("message1", "2019-08-03 01:00:00"),
("message2", "2019-08-03 01:01:00"),
("message3", "2019-08-03 01:03:00")
).toDF("message", "timestamp")
val duration = "2 minutes"
df.
groupBy(window($"timestamp", duration)).
agg(concat_ws(" ", collect_list($"message")).as("message")).
show(false)
// +------------------------------------------+-----------------+
// |window |message |
// +------------------------------------------+-----------------+
// |[2019-08-03 01:00:00, 2019-08-03 01:02:00]|message1 message2|
// |[2019-08-03 01:02:00, 2019-08-03 01:04:00]|message3 |
// +------------------------------------------+-----------------+
谢谢这似乎就是我要找的
import org.apache.spark.sql.functions._
import spark.implicits._
val df = Seq(
("message1", "2019-08-03 01:00:00"),
("message2", "2019-08-03 01:01:00"),
("message3", "2019-08-03 01:03:00")
).toDF("message", "timestamp")
val duration = "2 minutes"
df.
groupBy(window($"timestamp", duration)).
agg(concat_ws(" ", collect_list($"message")).as("message")).
show(false)
// +------------------------------------------+-----------------+
// |window |message |
// +------------------------------------------+-----------------+
// |[2019-08-03 01:00:00, 2019-08-03 01:02:00]|message1 message2|
// |[2019-08-03 01:02:00, 2019-08-03 01:04:00]|message3 |
// +------------------------------------------+-----------------+