首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解spark窗口函数的结果

如何理解spark窗口函数的结果
EN

Stack Overflow用户
提问于 2017-11-14 03:16:59
回答 2查看 598关注 0票数 1

我有以下代码来尝试spark窗口函数:

代码语言:javascript
复制
test("spark sql time window 2") {
    val spark = SparkSession.builder().master("local").appName("SparkSQLWindowTest").getOrCreate()
    import spark.implicits._
    import org.apache.spark.sql.functions._
    val ds = Seq(
      SaleRecord("2017-10-11 09:01:12", 1),
      SaleRecord("2017-10-11 09:01:18", 6),
      SaleRecord("2017-10-11 10:11:12", 2),
      SaleRecord("2017-10-11 10:18:13", 5),
      SaleRecord("2017-10-11 10:22:13", 3),
      SaleRecord("2017-10-11 10:22:22", 6),
      SaleRecord("2017-10-11 10:34:56", 2),
      SaleRecord("2017-10-11 10:48:22", 6),
      SaleRecord("2017-10-11 11:52:23", 4),
      SaleRecord("2017-10-11 12:56:24", 2)).toDS

    val ds2 = ds.groupBy(window($"Time", "20 minutes", "9 minutes")).agg(sum("revenue")).orderBy("window.start")
    ds2.show(truncate = false)

    /*
+---------------------------------------------+------------+
|window                                       |sum(revenue)|
+---------------------------------------------+------------+
|[2017-10-11 08:45:00.0,2017-10-11 09:05:00.0]|7.0         |
|[2017-10-11 08:54:00.0,2017-10-11 09:14:00.0]|7.0         |
|[2017-10-11 09:57:00.0,2017-10-11 10:17:00.0]|2.0         |
|[2017-10-11 10:06:00.0,2017-10-11 10:26:00.0]|16.0        |
|[2017-10-11 10:15:00.0,2017-10-11 10:35:00.0]|16.0        |
|[2017-10-11 10:24:00.0,2017-10-11 10:44:00.0]|2.0         |
|[2017-10-11 10:33:00.0,2017-10-11 10:53:00.0]|8.0         |
|[2017-10-11 10:42:00.0,2017-10-11 11:02:00.0]|6.0         |
|[2017-10-11 11:36:00.0,2017-10-11 11:56:00.0]|4.0         |
|[2017-10-11 11:45:00.0,2017-10-11 12:05:00.0]|4.0         |
|[2017-10-11 12:39:00.0,2017-10-11 12:59:00.0]|2.0         |
|[2017-10-11 12:48:00.0,2017-10-11 13:08:00.0]|2.0         |
+---------------------------------------------+------------+


     */
  }

SaleRecord的定义是一个简单的案例类:

代码语言:javascript
复制
case class SaleRecord(time: String, revenue: Double)

我无法理解前三行是如何在结果中生成的?

为什么第一个窗口是[2017-10-11 08:45:00.0,2017-10-11 09:05:00.0]

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-14 07:21:25

代码语言:javascript
复制
window(timeColumn, windowDuration, slideDuration=None, startTime=None)

首先,window函数将创建一个时间模板,这意味着:

代码语言:javascript
复制
zero = 1970-01-01 00:00:00 UTC

[zero + startTime + slideDuration * n, zero + startTime + slideDuration * n + windowDuration)

例如:

代码语言:javascript
复制
window('ts', '5 seconds', '3 seconds', '2 seconds')
# is equal to :
['1970-01-01 00:00:02', '1970-01-01 00:00:07'),
['1970-01-01 00:00:05', '1970-01-01 00:00:10'),
['1970-01-01 00:00:08', '1970-01-01 00:00:13'),
['1970-01-01 00:00:11', '1970-01-01 00:00:16'),
...

然后,DataFrame中的每一行都将“落入”时间模板,根据timeColumn的说法。一行可以属于多个时间模板单元格。

最后,删除所有空时间模板单元并执行agg

票数 1
EN

Stack Overflow用户

发布于 2017-11-14 06:52:30

使用windows功能,星火将计算来自unix时代时间1970-01-01 00:00:00 UTC的帧。因为您将淤泥持续时间设置为9 minutes,所以第一个框架包含来自Time列的值[2017-10-11 08:45:00.0,2017-10-11 09:05:00.0]

为清晰起见

代码语言:javascript
复制
$ date --date="2017-10-11 08:45:00" +"%s
1507686300
$ echo $[1507686300%180]
0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47277097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档