当按使用的时间窗口分组时,Spark 如何确定第一个窗口的 window.start?

Posted

技术标签:

【中文标题】当按使用的时间窗口分组时,Spark 如何确定第一个窗口的 window.start?【英文标题】:How does Spark determine window.start for first window when grouping by time window used? 【发布时间】:2018-07-27 19:27:14 【问题描述】:

这是数据示例:

scala> purchases.show(false)
+---------+-------------------+--------+
|client_id|transaction_ts     |store_id|
+---------+-------------------+--------+
|1        |2018-06-01 12:17:37|1       |
|1        |2018-06-02 13:17:37|2       |
|1        |2018-06-03 14:17:37|3       |
|1        |2018-06-09 10:17:37|2       |
|2        |2018-06-02 10:17:37|1       |
|2        |2018-06-02 13:17:37|2       |
|2        |2018-06-08 14:19:37|3       |
|2        |2018-06-16 13:17:37|2       |
|2        |2018-06-17 14:17:37|3       |
+---------+-------------------+--------+

当我按时间窗口分组时:

scala> purchases.groupBy($"client_id", window($"transaction_ts", "8 days")).count.orderBy("client_id", "window.start")show(false)

+---------+---------------------------------------------+-----+                 
|client_id|window                                       |count|
+---------+---------------------------------------------+-----+
|1        |[2018-05-28 17:00:00.0,2018-06-05 17:00:00.0]|3    |
|1        |[2018-06-05 17:00:00.0,2018-06-13 17:00:00.0]|1    |
|2        |[2018-05-28 17:00:00.0,2018-06-05 17:00:00.0]|2    |
|2        |[2018-06-05 17:00:00.0,2018-06-13 17:00:00.0]|1    |
|2        |[2018-06-13 17:00:00.0,2018-06-21 17:00:00.0]|2    |
+---------+---------------------------------------------+-----+

我想知道为什么第一个 window.start2018-05-28 17:00:00.0 而数据中的最小值是 2018-06-01 12:17:37

Spark 如何计算时间窗口?我期待第一个最小值将用作min window.start...

【问题讨论】:

What does the pyspark.sql.functions.window function's 'startTime' argument do and window.start? 【参考方案1】:

感谢@user8371915!

按照建议的链接,我找到了我正在寻找的答案,特别是 window.start 与我的数据无关,Spark 生成从 1970-01-01 开始的窗口。更多详情请参考What does the 'pyspark.sql.functions.window' function's 'startTime' argument do?

【讨论】:

以上是关于当按使用的时间窗口分组时,Spark 如何确定第一个窗口的 window.start?的主要内容,如果未能解决你的问题,请参考以下文章

当子窗口具有递增值时如何增加父组编号?

使用 Spark/Scala 有效地按键分组并查找在特定时间窗口中发生的事件的上一个时间戳

Spark Structured Streaming 窗口化和分组操作

Spark 和 SparkSQL:如何模仿窗口功能?

Scala(Spark)-当列是列表时如何分组

Win32 API 打开新窗口