时间戳与Avro模式

时间:2019-05-29 19:23:30

标签: avro vertica

我有Vertica调度程序,该调度程序使用来自Kafka的avro数据。 Vertica的一列是TIMESTAMP,目前,我尝试定义Avro模式,如下例所示:

 {
     "name":"startDate",
     "type": "long",
     "logicalType": "timestamp-millis"
  },

问题是我的调度程序无法使用数据,并且在Vertica的调度程序表上也找不到任何错误。 知道我需要在avro模式中进行哪些更改吗?

3 个答案:

答案 0 :(得分:0)

我问了类似的问题。您应该在这里找到答案。

How to transform all timestamp fields when using Kafka Connect?

答案 1 :(得分:0)

我认为您的问题可能是Vertica时间戳不是Unix纪元时间(以毫秒为单位)(您的Avro模式具有的时间)

https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SQLReferenceManual/DataTypes/Date-Time/DateTimeDataTypes.htm

您将不得不使用BIGINT或字符串类型的列,然后使用一些Vertica日期函数将其转换为可读的时间戳记

https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SQLReferenceManual/Functions/Formatting/TO_TIMESTAMP.htm

答案 2 :(得分:0)

正如我试图在最后一个答案中指出的那样(由于某种原因而将其删除),您无法对调度程序提取的数据进行任何类型转换或转换。

要获得正确的时间戳,您有两种选择:

  1. 使用我在原始答案中已链接到的单个消息转换(https://docs.confluent.io/current/connect/transforms/timestampconverter.html)与Kafka Connect进行转换,或者
  2. 直接从Kafka复制数据,然后将数据复制到Vertica表或flex表中进行转换。

要执行第二个选项,您可以将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一侧进行任何强制转换。