KSQL - 更改窗口翻转子句中的时区



在这里,我的KSQL使用WINDOW 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

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

<sale_date BIGINT, region VARCHAR, total DOUBLE>

假设sale_date是销售的时间戳,我们的本地时间是太平洋标准时间,我们可以使用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;

请注意,无需为上述查询指定窗口。

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

我可以看到想要根据您的时区按天聚合的有效性。我已经在 KSQL github 项目中将其作为一个问题提出,并建议您在那里跟踪它。

最新更新