【问题标题】:How to use ISO-8601 date in flink SQL?如何在 flink SQL 中使用 ISO-8601 日期?
【发布时间】:2022-10-20 16:23:34
【问题描述】:

根据我的研究,Flink SQL 接受“0000-01-01 00:00:00.000000000”作为时间戳格式,但我在 kafka 中的时间戳采用“0000-01-01T00:00:00.000000000”格式,这是由 flink sql 查询引起的失败。

有没有办法将日期的某种常见格式(例如 2022-05-02T18:28:07.881414Z)转换为 flink 中所需的格式?在其他 SQL 语言中,这将是一个非常简单的操作,但是通过阅读 Flink 文档,我看不到这样做的方法。

我尝试进行字符串替换并将字符串转换为时间戳,但它不起作用。我正在运行 Flink 1.13。

我尝试使用 CONVERT_TZ() 但它不适用于字符串时间戳:

这有效:

SELECT
  CONVERT_TZ(string_ts, 'UTC', 'America/Los_Angeles') as test_ts
FROM
  (VALUES ('2022-05-02 18:28:07.881414Z')) AS NameTable(string_ts);

这不起作用:

SELECT
  CONVERT_TZ(string_ts, 'UTC', 'America/Los_Angeles') as test_ts
FROM
  (VALUES ('2022-05-02T18:28:07.881414Z')) AS NameTable(string_ts);

这给了我一个时间戳,但我对更改时区不感兴趣。如何将带有替换的字符串转换为可与其他时间戳函数一起使用的时间戳?比如时间戳差异:

SELECT
    TO_TIMESTAMP(replace(string_ts, 'T', ' ')) -- gives null
    , CONVERT_TZ(replace(string_ts, 'T', ' '), 'UTC', 'America/Los_Angeles') -- works
FROM
  (VALUES ('2022-05-02T18:28:07.881414Z')) AS NameTable(string_ts);

如何让 Flink 将 '2022-05-02T18:28:07.881414Z' 识别为时间戳?

【问题讨论】:

    标签: sql casting timestamp apache-flink


    【解决方案1】:

    如果您使用 JSON 格式来摄取此数据,则可以设置此选项

    json.timestamp-format.standard: ISO-8601

    告诉 Flink 如何解释字符串。这在https://nightlies.apache.org/flink/flink-docs-stable/docs/connectors/table/formats/json/#json-timestamp-format-standard 的文档中有所描述。

    如果您需要使用 Flink SQL 将 ISO-8601 字符串转换为时间戳,您可能会发现 CONVERT_TZ(string1, string2, string3) 很有帮助,或者您可能更愿意将此转换实现为用户定义的函数。

    【讨论】:

    • 嗨大卫,我用你提供的更多例子更新了这个问题。
    • 嘿,您有机会查看我提供的最新示例吗?非常感谢您的帮助!
    【解决方案2】:

    选择 TO_TIMESTAMP(replace(replace(string_ts, 'T', ' '), 'Z' ,'' )) 从 (值 ('2022-05-02T18:28:07.881414Z')) 作为 NameTable(string_ts);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 2013-02-03
      • 1970-01-01
      • 2014-07-06
      相关资源
      最近更新 更多