itinycheng / flink-connector-clickhouse

Flink SQL connector for ClickHouse. Support ClickHouseCatalog and read/write primary data, maps, arrays to clickhouse.
Apache License 2.0
349 stars 149 forks source link

flink字段time,ck字段datetime,写入报错 #3

Closed liyubin117 closed 2 years ago

liyubin117 commented 2 years ago
CREATE TABLE source (
  `id`    int,
   name varchar,
   t   time
) WITH (
    'connector' = 'datagen'
);

CREATE TABLE sink (
`id` int,
name varchar,
  t    time ,
 primary key(id) not enforced
) WITH (
  'connector' = 'jdbc',
  'url' = 'jdbc:clickhouse://url.163.org:8123/',
   'database-name' = 'lyblocal',
  'username' = 'default',
  'password' = '',
   'table-name' = 'mt3',
   'sink.distribute-table-write-local' = 'false',
   'sink.ignore-delete' = 'false',
   'sink.partition-strategy' = 'hash',
   'sink.partition-key' = 'id',
   'sink.buffer-flush.max-rows' = '1'
);

insert into sink
select id,name,t  from source;

报错如下: Column 0, name: id, type: Int32, parsed text: "-816858032" Column 1, name: name, type: String, parsed text: "9fb989b731b7d0f32d66dee746308ee77eb311db99a220adc78817b43e23c36ae32975e02834ec1f54308fd10d7f60f8c2fb" Column 2, name: t, type: DateTime, parsed text: "17"ERROR: DateTime must be in YYYY-MM-DD hh:mm:ss or NNNNNNNNNN (unix timestamp, exactly 10 digits) format. Code: 41, e.displayText() = DB::ParsingException: Cannot parse datetime

liyubin117 commented 2 years ago

@itinycheng 麻烦看一下,是不是因为ck本身不支持不带日期的时间呢

itinycheng commented 2 years ago

@itinycheng 麻烦看一下,是不是因为ck本身不支持不带日期的时间呢

确实如你所说,DateTime只支持带日期的时间,社区文档:https://clickhouse.com/docs/en/sql-reference/data-types/datetime/ ;

报错过程:Clickhouse jdbc接收Flink中Time字段并将其转换成了 hh:mm:ss,这个格式不被ClickHouse Server端接受;

看ClickHouse Types好像没有支持 不带日期的Time,可以将Time转成Long类型保存,绕过这个问题;

itinycheng commented 2 years ago

@liyubin117 关于兼容Flink Time问题有什么好建议不?我想修复这个问题;

当前可选方案两个:

  1. 加固定日期前缀1970-01-01,将Time转成1970-01-01 hh:mm:ss然后写Clickhouse的DateTime字段;
  2. Flink Time内部是用Int存储的,直接将Time转Int类型写入ClickHouse的Int32字段;
liyubin117 commented 2 years ago

@itinycheng 第一种方案在flink内部加个日期转换成clickhouse可以接收的形式,对用户来说不需要修改表结构,还能直接使用clickhouse自带的时间相关的udf,使用起来更友好些,但缺点就是数据含义发生了变化,容易产生歧义。如果用户觉得不影响的话,还是第一种比较好

itinycheng commented 2 years ago

@itinycheng 第一种方案在flink内部加个日期转换成clickhouse可以接收的形式,对用户来说不需要修改表结构,还能直接使用clickhouse自带的时间相关的udf,使用起来更友好些,但缺点就是数据含义发生了变化,容易产生歧义。如果用户觉得不影响的话,还是第一种比较好

好的,谢谢建议,我周末想想看,修复这个问题;

itinycheng commented 2 years ago

@liyubin117

Bug已修复,添加了1970-01-02前缀,参考了ClickHouse的 toTime 函数的输出 : https://github.com/itinycheng/flink-connector-clickhouse/commit/d33ff40b0d17f8859f23900f15f5045e6e2e6368

liyubin117 commented 2 years ago

@itinycheng excellent!