代码之家  ›  专栏  ›  技术社区  ›  Archon

ksql-更改window tumbling子句中的时区

  •  0
  • Archon  · 技术社区  · 6 年前

    这里我的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
    
    2 回复  |  直到 5 年前
        1
  •  1
  •   Robin Moffatt    6 年前

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

    我可以看到想要根据你的时区按日汇总的有效性。我把它当作 an issue on the KSQL github project ,并建议您在那里跟踪它。

        2
  •  0
  •   Hojjat    6 年前

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

    <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;

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