Scala 基于时间戳值连接数据帧行

Scala 基于时间戳值连接数据帧行,scala,apache-spark,Scala,Apache Spark,我有一个带有文本消息的数据框和每行的时间戳值。 像这样: 我需要通过创建X分钟数的时间窗口来连接消息,例如,它们如下所示: +---------------------------------------------------+ | message | +---------------------------------------------------+ | some text from message 1

我有一个带有文本消息的数据框和每行的时间戳值。 像这样:

我需要通过创建X分钟数的时间窗口来连接消息,例如,它们如下所示:

+---------------------------------------------------+
| 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         |
// +------------------------------------------+-----------------+