apache-kafka ksqlDB显示错误的'yyyy-MM-dd HH:mm:ss.SSSSSS'时间戳格式

q35jwt9p  于 2022-11-01  发布在  Apache
关注(0)|答案(1)|浏览(120)

我使用kafka-connect将一个表从MySQL流到一个Kafka主题中,该表包含一些datetime(6)列类型的列,如1611290740285818
当我使用ksqlDB将此时间戳转换为字符串时,使用:

SELECT TIMESTAMPTOSTRING(my_timestamp, 'yyyy-MM-dd HH:mm:ss.SSSSSS','UTC') AS DT6
      FROM my_topic
      EMIT CHANGES;

显示的字符串实际上是+53114-10-20 14:12:20.712000,而实际时间应该是2021-01-22 04:45:40.285818
有人能告诉我我的查询有什么问题吗?

e5nqia27

e5nqia271#

艾丹的回答是正确的。您共享的bigint值是微秒,ksqlDB的TIMESTAMPTOSTRING函数需要 * 毫秒 *。您指定的时间格式字符串只是告诉ksqlDB如何格式化时间戳,而不是如何解释它。下面是一个示例:

-- Create a sample stream
ksql> CREATE STREAM TMP (TS BIGINT) WITH (KAFKA_TOPIC='TMP', PARTITIONS=1, VALUE_FORMAT='AVRO');

 Message
----------------
 Stream created
----------------

-- Populate it with example data
ksql> INSERT INTO TMP VALUES (1611290740285818);

-- Query the stream from the beginning
ksql> SET 'auto.offset.reset' = 'earliest';
>
Successfully changed local property 'auto.offset.reset' from 'earliest' to 'earliest'.

-- Reproduce the described behaviour
ksql> SELECT TS, TIMESTAMPTOSTRING(TS, 'yyyy-MM-dd HH:mm:ss.SSSSSS','UTC') FROM TMP EMIT CHANGES;
+--------------------+------------------------------+
|TS                  |KSQL_COL_0                    |
+--------------------+------------------------------+
|1611290740285818    |+53029-10-09 09:11:25.818000  |
^CQuery terminated

通过将微秒除以1000,它们变为毫秒,并且函数的行为与您预期的一样:

ksql> SELECT TS, 
             TIMESTAMPTOSTRING(TS/1000, 'yyyy-MM-dd HH:mm:ss.SSS','UTC') 
        FROM TMP 
      EMIT CHANGES;
+------------------+-------------------------+
|TS                |KSQL_COL_0               |
+------------------+-------------------------+
|1611290740285818  |2021-01-22 04:45:40.285  |

相关问题