flinksql接收到字段值格式为2020-09-23T20:58:24+08:00,如何转成TIMESTAMP

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

flinksql接收到字段值格式为2020-09-23T20:58:24+08:00,如何转成TIMESTAMP

cxydevelop@163.com
flinksql 版本是1.11.2
source接收到字段是字符串类型的时间
CREATE TABLE sourceTable (
     `time` STRING
 ) WITH(
...
 );


sink如下
CREATE TABLE sinktable (
    `time1` STRING,
    `time` TIMESTAMP(3)
 ) WITH (
     'connector' = 'print'
 );


insert语句,不知道怎么正确修改TO_TIMESTAMP默认的格式
 insert into sinktable select `time`,TO_TIMESTAMP(`time`,'yyyy-MM-ddTHH:mm:ss+08:00') from sourceTable


报错说是format错误
Caused by: java.lang.IllegalArgumentException: Unknown pattern letter: T
at java.time.format.DateTimeFormatterBuilder.parsePattern(DateTimeFormatterBuilder.java:1663)
at java.time.format.DateTimeFormatterBuilder.appendPattern(DateTimeFormatterBuilder.java:1572)
at java.time.format.DateTimeFormatter.ofPattern(DateTimeFormatter.java:534)
Reply | Threaded
Open this post in threaded view
|

Re: flinksql接收到字段值格式为2020-09-23T20:58:24+08:00,如何转成TIMESTAMP

Jark
Administrator
Flink 的 TO_TIMESTAMP 函数用的是 Java SimpleDateFormat 来解析时间格式的,所以可以看下
SimpleDateFormat 的 javadoc。
你可以试下 to_timestamp('2020-09-23T20:58:24+08:00',
'yyyy-MM-dd''T''HH:mm:ssXXX') 来解析你的数据。

Best,
Jark

On Wed, 23 Sep 2020 at 21:08, chenxuying <[hidden email]> wrote:

> flinksql 版本是1.11.2
> source接收到字段是字符串类型的时间
> CREATE TABLE sourceTable (
>      `time` STRING
>  ) WITH(
> ...
>  );
>
>
> sink如下
> CREATE TABLE sinktable (
>     `time1` STRING,
>     `time` TIMESTAMP(3)
>  ) WITH (
>      'connector' = 'print'
>  );
>
>
> insert语句,不知道怎么正确修改TO_TIMESTAMP默认的格式
>  insert into sinktable select
> `time`,TO_TIMESTAMP(`time`,'yyyy-MM-ddTHH:mm:ss+08:00') from sourceTable
>
>
> 报错说是format错误
> Caused by: java.lang.IllegalArgumentException: Unknown pattern letter: T
> at
> java.time.format.DateTimeFormatterBuilder.parsePattern(DateTimeFormatterBuilder.java:1663)
> at
> java.time.format.DateTimeFormatterBuilder.appendPattern(DateTimeFormatterBuilder.java:1572)
> at java.time.format.DateTimeFormatter.ofPattern(DateTimeFormatter.java:534)
Reply | Threaded
Open this post in threaded view
|

回复: flinksql接收到字段值格式为2020-09-23T20:58:24+08:00,如何转成TIMESTAMP

Joker
不好意思,插入个问题。ts AS TO_TIMESTAMP(FROM_UNIXTIME(create_time / 1000, 'yyyy-MM-dd HH:mm:ss')) ,我按此方式生成事件时间列,发现watermark一直比北京时间多8小时,比如create_time 为1600926591666,ts计算出来是2020/9/24 13:49:51没问题,但在WebUI上发现提取的watermark为2020/9/24 21:49:51


| |
Joker
|
|
[hidden email]
|
签名由网易邮箱大师定制


在2020年09月24日 13:40,Jark Wu<[hidden email]> 写道:
Flink 的 TO_TIMESTAMP 函数用的是 Java SimpleDateFormat 来解析时间格式的,所以可以看下
SimpleDateFormat 的 javadoc。
你可以试下 to_timestamp('2020-09-23T20:58:24+08:00',
'yyyy-MM-dd''T''HH:mm:ssXXX') 来解析你的数据。

Best,
Jark

On Wed, 23 Sep 2020 at 21:08, chenxuying <[hidden email]> wrote:

flinksql 版本是1.11.2
source接收到字段是字符串类型的时间
CREATE TABLE sourceTable (
`time` STRING
) WITH(
...
);


sink如下
CREATE TABLE sinktable (
`time1` STRING,
`time` TIMESTAMP(3)
) WITH (
'connector' = 'print'
);


insert语句,不知道怎么正确修改TO_TIMESTAMP默认的格式
insert into sinktable select
`time`,TO_TIMESTAMP(`time`,'yyyy-MM-ddTHH:mm:ss+08:00') from sourceTable


报错说是format错误
Caused by: java.lang.IllegalArgumentException: Unknown pattern letter: T
at
java.time.format.DateTimeFormatterBuilder.parsePattern(DateTimeFormatterBuilder.java:1663)
at
java.time.format.DateTimeFormatterBuilder.appendPattern(DateTimeFormatterBuilder.java:1572)
at java.time.format.DateTimeFormatter.ofPattern(DateTimeFormatter.java:534)
Reply | Threaded
Open this post in threaded view
|

Re: flinksql接收到字段值格式为2020-09-23T20:58:24+08:00,如何转成TIMESTAMP

Jark
Administrator
FROM_UNIXTIME 接收的第一个参数是 unix time 值, 可以理解为UTC时区的值。
所以如果你的 long 值是北京时间下得到的,那么需要自己手动减一个8时区。

Best,
Jark

On Thu, 24 Sep 2020 at 13:54, Joker <[hidden email]> wrote:

> 不好意思,插入个问题。ts AS TO_TIMESTAMP(FROM_UNIXTIME(create_time / 1000,
> 'yyyy-MM-dd HH:mm:ss')) ,我按此方式生成事件时间列,发现watermark一直比北京时间多8小时,比如create_time
> 为1600926591666,ts计算出来是2020/9/24
> 13:49:51没问题,但在WebUI上发现提取的watermark为2020/9/24 21:49:51
>
>
> | |
> Joker
> |
> |
> [hidden email]
> |
> 签名由网易邮箱大师定制
>
>
> 在2020年09月24日 13:40,Jark Wu<[hidden email]> 写道:
> Flink 的 TO_TIMESTAMP 函数用的是 Java SimpleDateFormat 来解析时间格式的,所以可以看下
> SimpleDateFormat 的 javadoc。
> 你可以试下 to_timestamp('2020-09-23T20:58:24+08:00',
> 'yyyy-MM-dd''T''HH:mm:ssXXX') 来解析你的数据。
>
> Best,
> Jark
>
> On Wed, 23 Sep 2020 at 21:08, chenxuying <[hidden email]> wrote:
>
> flinksql 版本是1.11.2
> source接收到字段是字符串类型的时间
> CREATE TABLE sourceTable (
> `time` STRING
> ) WITH(
> ...
> );
>
>
> sink如下
> CREATE TABLE sinktable (
> `time1` STRING,
> `time` TIMESTAMP(3)
> ) WITH (
> 'connector' = 'print'
> );
>
>
> insert语句,不知道怎么正确修改TO_TIMESTAMP默认的格式
> insert into sinktable select
> `time`,TO_TIMESTAMP(`time`,'yyyy-MM-ddTHH:mm:ss+08:00') from sourceTable
>
>
> 报错说是format错误
> Caused by: java.lang.IllegalArgumentException: Unknown pattern letter: T
> at
>
> java.time.format.DateTimeFormatterBuilder.parsePattern(DateTimeFormatterBuilder.java:1663)
> at
>
> java.time.format.DateTimeFormatterBuilder.appendPattern(DateTimeFormatterBuilder.java:1572)
> at java.time.format.DateTimeFormatter.ofPattern(DateTimeFormatter.java:534)
>
Reply | Threaded
Open this post in threaded view
|

Re: flinksql接收到字段值格式为2020-09-23T20:58:24+08:00,如何转成TIMESTAMP

nashcen
+1 同样遇到这样的问题,Hive的小时分区和事件时间对不上,差了8个小时



--
Sent from: http://apache-flink.147419.n8.nabble.com/
Reply | Threaded
Open this post in threaded view
|

回复: flinksql接收到字段值格式为2020-09-23T20:58:24+08:00,如何转成TIMESTAMP

lemon
默认是按照utc时间来算的






------------------&nbsp;原始邮件&nbsp;------------------
发件人:                                                                                                                        "user-zh"                                                                                    <[hidden email]&gt;;
发送时间:&nbsp;2020年9月24日(星期四) 下午4:32
收件人:&nbsp;"user-zh"<[hidden email]&gt;;

主题:&nbsp;Re: flinksql接收到字段值格式为2020-09-23T20:58:24+08:00,如何转成TIMESTAMP



+1 同样遇到这样的问题,Hive的小时分区和事件时间对不上,差了8个小时



--
Sent from: http://apache-flink.147419.n8.nabble.com/
Reply | Threaded
Open this post in threaded view
|

Re: flinksql接收到字段值格式为2020-09-23T20:58:24+08:00,如何转成TIMESTAMP

Tianwang Li
In reply to this post by Joker
FROM_UNIXTIME 使用的是本地时区, (可以看,org.apache.flink.table.runtime.functions.
SqlDateTimeUtils#fromUnixtime的实现)
可以指定时区,StreamTableEnvironment.getConfig().setLocalTimeZone()

Joker <[hidden email]> 于2020年9月24日周四 下午1:54写道:

> 不好意思,插入个问题。ts AS TO_TIMESTAMP(FROM_UNIXTIME(create_time / 1000,
> 'yyyy-MM-dd HH:mm:ss')) ,我按此方式生成事件时间列,发现watermark一直比北京时间多8小时,比如create_time
> 为1600926591666,ts计算出来是2020/9/24
> 13:49:51没问题,但在WebUI上发现提取的watermark为2020/9/24 21:49:51
>
>
> | |
> Joker
> |
> |
> [hidden email]
> |
> 签名由网易邮箱大师定制
>
>
> 在2020年09月24日 13:40,Jark Wu<[hidden email]> 写道:
> Flink 的 TO_TIMESTAMP 函数用的是 Java SimpleDateFormat 来解析时间格式的,所以可以看下
> SimpleDateFormat 的 javadoc。
> 你可以试下 to_timestamp('2020-09-23T20:58:24+08:00',
> 'yyyy-MM-dd''T''HH:mm:ssXXX') 来解析你的数据。
>
> Best,
> Jark
>
> On Wed, 23 Sep 2020 at 21:08, chenxuying <[hidden email]> wrote:
>
> flinksql 版本是1.11.2
> source接收到字段是字符串类型的时间
> CREATE TABLE sourceTable (
> `time` STRING
> ) WITH(
> ...
> );
>
>
> sink如下
> CREATE TABLE sinktable (
> `time1` STRING,
> `time` TIMESTAMP(3)
> ) WITH (
> 'connector' = 'print'
> );
>
>
> insert语句,不知道怎么正确修改TO_TIMESTAMP默认的格式
> insert into sinktable select
> `time`,TO_TIMESTAMP(`time`,'yyyy-MM-ddTHH:mm:ss+08:00') from sourceTable
>
>
> 报错说是format错误
> Caused by: java.lang.IllegalArgumentException: Unknown pattern letter: T
> at
>
> java.time.format.DateTimeFormatterBuilder.parsePattern(DateTimeFormatterBuilder.java:1663)
> at
>
> java.time.format.DateTimeFormatterBuilder.appendPattern(DateTimeFormatterBuilder.java:1572)
> at java.time.format.DateTimeFormatter.ofPattern(DateTimeFormatter.java:534)
>


--
**************************************
 tivanli
**************************************