我有Vertica调度程序,该调度程序使用来自Kafka的avro数据。 Vertica的一列是TIMESTAMP,目前,我尝试定义Avro模式,如下例所示:
{
"name":"startDate",
"type": "long",
"logicalType": "timestamp-millis"
},
问题是我的调度程序无法使用数据,并且在Vertica的调度程序表上也找不到任何错误。 知道我需要在avro模式中进行哪些更改吗?
答案 0 :(得分:0)
我问了类似的问题。您应该在这里找到答案。
How to transform all timestamp fields when using Kafka Connect?
答案 1 :(得分:0)
我认为您的问题可能是Vertica时间戳不是Unix纪元时间(以毫秒为单位)(您的Avro模式具有的时间)
您将不得不使用BIGINT或字符串类型的列,然后使用一些Vertica日期函数将其转换为可读的时间戳记
答案 2 :(得分:0)
正如我试图在最后一个答案中指出的那样(由于某种原因而将其删除),您无法对调度程序提取的数据进行任何类型转换或转换。
要获得正确的时间戳,您有两种选择:
要执行第二个选项,您可以将Kafka中的timestamp-millis时期除以1,000,然后使用TO_TIMESTAMP
函数。如果Kafka时间戳记的毫秒数是1556204536000,那么您可以执行以下SQL来获取实际的时间戳记:
SELECT TO_TIMESTAMP(1556204536000 / 1000);
哪个将返回值:
2019-04-25 15:02:16
但是,第二种选择要求您每次获取新数据时都进行新的转换,因此,仅当您使用Kafka进行批量加载时,它才真正有用。
您最好的选择是在将数据发送到Kafka之前,使用单个消息转换或找到将timestamp列转换为字符串格式的其他方法。 Vertica将接受TIMESTAMP
列中的字符串,因此您无需在Vertica一侧进行任何强制转换。