在我的KSQL中使用SELECT
子句:
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
我们可以看到,我在UTC + 8。但是无论时区如何,1538179200000 = 2018-09-29 08:00:00 (UTC+8)
1538265600000 = 2018-09-30 08:00:00 (UTC+8)
日期时间都应start
,而不要早8小时。这样可以更改时区吗?
PS:我在2018-09-29 00:00:00
尝试了几种窗口大小,但我完全迷失了。.
2018-09-30 11:33:00
答案 0 :(得分:1)
时间戳窗口始终相对于纪元(UTC / GMT)进行计算。
我可以看到希望根据您的时区按天汇总的有效性。我将其提升为an issue on the KSQL github project,建议您在此处进行跟踪。
答案 1 :(得分:0)
如果您仅使用滚动窗口,则可以将时间视为另一个维度,并在此维度上进行汇总,而根本不使用任何窗口。 这是一个例子。 让我们考虑输入流架构如下:
<sale_date BIGINT, region VARCHAR, total DOUBLE>
假设sale_date
是销售的时间戳,而我们的当地时间是PST,则可以使用TIMESTAMPTOSTRING
函数为给定时区的每个销售提取不同的时间粒度,如下所示:< / p>
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;
请注意,您无需为上述查询指定窗口。