在我的一个用例中,我正在尝试创建管道
每当我从自定义分区发送消息时,我都会以毫秒为单位发送带有LONG数据类型的时间戳,因为在架构中,timestamp列已定义为long。
我先前在自定义分区中拥有的代码:
Date date = new Date();
long timeMilli = date.getTime();
System.out.println("date = " + date.toString() + " , time in millis = " + timeMilli);
在发送记录之前显示结果:
在表2的时间戳列中插入了日期= 2019年3月26日星期二22:02:04,以毫秒为单位的时间= 1553652124063
值:
2019/3/27下午2:02:04.063000
由于采用了英国时区(我认为),因此我暂时将其定为从当前时间戳中减去4个小时,以便与美国EST时间戳匹配。
Date date = new Date();
Date adj_date = DateUtils.addHours(date,-4);
long timeMilli = adj_date.getTime();
System.out.println("date = " + date.toString() + " , time in millis = " + timeMilli);
显示结果:
在表2的时间戳列中插入了date = 2019年3月26日星期二22:04:43,以毫秒为单位的时间= 1553637883826
值:
2019/3/26下午10:04:43.826000
请让我知道是否丢失了任何内容,因为我不确定从自定义分区发送消息时为什么会发生这种情况。
答案 0 :(得分:1)
Jdbc Source Connector内幕使用以下查询:
SELECT * FROM someTable
WHERE
someTimestampColumn < $endTimetampValue
AND (
(someTimestampColumn = $beginTimetampValue AND someIncrementalColumn > $lastIncrementedValue)
OR someTimestampColumn > $beginTimetampValue)
ORDER BY someTimestampColumn, someIncrementalColumn ASC
总结:如果行的时间戳列的值比当前时间戳早 且比上次检查的 晚,则查询将检索行。
>以上参数是:
beginTimetampValue
-最后导入的记录的时间戳列的值endTimetampValue
-根据数据库的当前时间戳记lastIncrementedValue
-最后导入的记录的增量列的值我认为在您的情况下,Producer
将时间戳记设置为更高的表记录,而不是稍后(使用查询)手动插入 。
当Jdbc Connector检查要导入到Kafka的新记录时,它会跳过这些记录(因为它们未填写someTimestampColumn < $endTimetampValue
时间戳条件)
您还可以将日志级别更改为DEBUG
,并查看日志中发生的事情