0

这是我的 KSQL usingWINDOW TUMBLING子句:

SELECT 
    sale_date,
    region,
    SUM(total)
FROM orders
WINDOW TUMBLING (SIZE 24 HOURS)
GROUP BY sale_date, region;

一些结果:

2018-09-29|+|zskx_fz : Window{start=1538179200000 end=-} | 2018-09-29 | zskx_fz | 16119.8
2018-09-30|+|zskx_fz : Window{start=1538179200000 end=-} | 2018-09-30 | zskx_fz | 2031.6
2018-09-30|+|zskx_fz : Window{start=1538265600000 end=-} | 2018-09-30 | zskx_fz | 894.7

到日期时间的纪元毫秒是:

1538179200000 = 2018-09-29 08:00:00 (UTC+8)
1538265600000 = 2018-09-30 08:00:00 (UTC+8)

正如我们所看到的,我在 UTC+8。但无论时区如何,start日期时间不应2018-09-29 00:00:00早于 8 小时。那么它能够改变时区吗?

PS:我尝试了几个窗口大小,2018-09-30 11:33:00我完全失去了..

WINDOW TUMBLING (SIZE 1 minutes)    2018-09-30 11:32:00
WINDOW TUMBLING (SIZE 2 hours)      2018-09-30 10:00:00
WINDOW TUMBLING (SIZE 5 hours)      2018-09-30 07:00:00
WINDOW TUMBLING (SIZE 10 hours)     2018-09-30 02:00:00
WINDOW TUMBLING (SIZE 11 hours)     2018-09-30 07:00:00
WINDOW TUMBLING (SIZE 12 hours)     2018-09-30 08:00:00
WINDOW TUMBLING (SIZE 24 hours)     2018-09-30 08:00:00
4

2 回答 2

1

时间戳窗口始终是相对于 UTC/GMT 的纪元计算的。

我可以看到想要根据您的时区按天汇总的有效性。我在 KSQL github 项目上提出了它作为一个问题,并建议你在那里跟踪它。

于 2018-10-01T09:28:48.627 回答
1

如果您只使用翻滚窗口,您可以将时间视为另一个维度并在此维度上执行聚合,而根本不使用任何窗口。这是一个例子。让我们考虑输入流模式如下:

<sale_date BIGINT, region VARCHAR, total DOUBLE>

假设sale_date是销售的时间戳,我们的本地时间是 PST,我们可以使用该TIMESTAMPTOSTRING函数为给定时区的每个销售提取不同的时间粒度,如下所示:

CREATE STREAM foo AS SELECT TIMESTAMPTOSTRING(sale_date, 'yyyy-MM-dd HH', 'PST') AS sale_hour, TIMESTAMPTOSTRING(sale_date, 'yyyy-MM-dd', 'PST') AS sale_day, TIMESTAMPTOSTRING(sale_date, 'yyyy-MM', 'PST') AS sale_month, region, total FROM orders; 现在,您应该能够在此流上编写聚合查询。例如,对于每个地区的每日销售额,您可以编写以下查询:

CRAETE TABLE daily_sale AS SELECT sale_day, region, sum(total) FROM foo GROUP BY sale_day, region;

请注意,您不需要为上述查询指定窗口。

于 2018-10-08T23:48:14.873 回答