@dingxiaobo 同步数据到clickhouse的datetime64类型,会丢失精度
sqlserver原表字段类型:datetime(3)
clickhouse字段类型:datetime64
btqmn9zl1#
补充:用同一张表做数据源进行测试, 同步到另外一张sqlserver表,时间是没有问题的
dsekswqp2#
谁是Reader,谁是Writer?DataX是支持毫秒精度的,只是不支持微秒和纳秒。你配置的JSON也发下。
xdnvmnnf3#
{"job": {"content": [{"reader": {"name": "sqlserverreader","parameter": {"column": ["[inputtime]"],"connection": [{"jdbcUrl": ["jdbc:sqlserver://xxxxxx:1433"],"table": ["test.dbo.a"]}],"password": "xxxx","username": "xxxx"}},"writer": {"name": "clickhousewriter","parameter": {"batchByteSize": 134217728,"batchSize": 65536,"column": [" inputtime " ],"connection": [{"jdbcUrl": "jdbc:clickhouse://xxxxxxxxx:8123/ods","table": ["a" ]}],"dryRun": false,"password": "xxxxxxx","preSql": ["truncate table ods . a "],"username": "xxxxxxx","writeMode": "insert"}}}],"setting": {"speed": {"channel": "1"}}}}
inputtime
ods
a
sqlserver是Reader,clickhouse是Writer我是用当前master分支的代码编译的
j5fpnvbx4#
是不是clickhouse-jdbc版本太低了,你升级到最新的试试。
Release v0.3.0support more data types: IPv4, IPv6, Int128, UInt128, Int256, UInt256, Decimal256, DateTime*, and Map
他到0.3.0版本才支持DateTime64;
7jmck4yq5#
应该就是clickhouse-jdbc版本太低的原因。在0.3.2版本中对TimeStamp的处理如下,有对纳秒精度的处理逻辑:public static String formatTimestamp(Timestamp time, TimeZone timeZone) {SimpleDateFormat formatter = getDateTimeFormat();formatter.setTimeZone(timeZone);StringBuilder formatted = new StringBuilder(formatter.format(time));if (time != null && time.getNanos() % 1000000 > 0) {formatted.append('.').append(time.getNanos());}return formatted.toString();}
在0.2.4版本中public static String formatTimestamp(Timestamp time, TimeZone timeZone) {getDateTimeFormat().setTimeZone(timeZone);return getDateTimeFormat().format(time);}
getDateTimeFormat()方法返回的是这个
private static ThreadLocal dateTimeFormat = new ThreadLocal() {@OverRideprotected SimpleDateFormat initialValue() {return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");}}
ccrfmcuu6#
同步数据报错 (类似 mysql读取,写入clickhouse报错 #1484,已经更新了代码,依然存在该问题),日志:日志.txt
同步数据报错 日志:错误日志.txt
修改 driver class
同步数据报错:错误日志2.txt
i5desfxk7#
看错误日志2.txt,似乎与列的时区TimeZone有关
t5zmwmid8#
字段类型 DateTime64(3, 'Asia/Shanghai') -> DateTime64(3),同步数据会存在 NullPointerException错误日志3.txt
oaxa6hgo9#
你原表里有null值,clickhouse-jdbc对NULL处理的有点问题。
升到最新0.3.2-patch11试试或者将该列显式设置为Nullable
你看下这个issueClickHouse/clickhouse-jdbc#878
9条答案
按热度按时间btqmn9zl1#
补充:用同一张表做数据源进行测试, 同步到另外一张sqlserver表,时间是没有问题的
dsekswqp2#
谁是Reader,谁是Writer?
DataX是支持毫秒精度的,只是不支持微秒和纳秒。
你配置的JSON也发下。
xdnvmnnf3#
{
"job": {
"content": [
{
"reader": {
"name": "sqlserverreader",
"parameter": {
"column": [
"[inputtime]"
],
"connection": [
{
"jdbcUrl": ["jdbc:sqlserver://xxxxxx:1433"],
"table": ["test.dbo.a"]
}
],
"password": "xxxx",
"username": "xxxx"
}
},
"writer": {
"name": "clickhousewriter",
"parameter": {
"batchByteSize": 134217728,
"batchSize": 65536,
"column": [
"
inputtime
"],
"connection": [
{
"jdbcUrl": "jdbc:clickhouse://xxxxxxxxx:8123/ods",
"table": [
"a"
]
}
],
"dryRun": false,
"password": "xxxxxxx",
"preSql": ["truncate table
ods
.a
"],"username": "xxxxxxx",
"writeMode": "insert"
}
}
}
],
"setting": {
"speed": {
"channel": "1"
}
}
}
}
sqlserver是Reader,clickhouse是Writer
我是用当前master分支的代码编译的
j5fpnvbx4#
是不是clickhouse-jdbc版本太低了,你升级到最新的试试。
Release v0.3.0
support more data types: IPv4, IPv6, Int128, UInt128, Int256, UInt256, Decimal256, DateTime*, and Map
他到0.3.0版本才支持DateTime64;
7jmck4yq5#
应该就是clickhouse-jdbc版本太低的原因。
在0.3.2版本中对TimeStamp的处理如下,有对纳秒精度的处理逻辑:
public static String formatTimestamp(Timestamp time, TimeZone timeZone) {
SimpleDateFormat formatter = getDateTimeFormat();
formatter.setTimeZone(timeZone);
StringBuilder formatted = new StringBuilder(formatter.format(time));
if (time != null && time.getNanos() % 1000000 > 0) {
formatted.append('.').append(time.getNanos());
}
return formatted.toString();
}
在0.2.4版本中
public static String formatTimestamp(Timestamp time, TimeZone timeZone) {
getDateTimeFormat().setTimeZone(timeZone);
return getDateTimeFormat().format(time);
}
getDateTimeFormat()方法返回的是这个
private static ThreadLocal dateTimeFormat = new ThreadLocal() {
@OverRide
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
}
ccrfmcuu6#
同步数据报错 (类似 mysql读取,写入clickhouse报错 #1484,已经更新了代码,依然存在该问题),日志:
日志.txt
同步数据报错 日志:
错误日志.txt
修改 driver class
同步数据报错:
错误日志2.txt
i5desfxk7#
看错误日志2.txt,似乎与列的时区TimeZone有关
t5zmwmid8#
字段类型 DateTime64(3, 'Asia/Shanghai') -> DateTime64(3),同步数据会存在 NullPointerException
错误日志3.txt
oaxa6hgo9#
你原表里有null值,clickhouse-jdbc对NULL处理的有点问题。
升到最新0.3.2-patch11试试
或者将该列显式设置为Nullable
你看下这个issue
ClickHouse/clickhouse-jdbc#878