将时间戳格式从 avro 复制到 redshift

Copying timestamp format from avro to redshift

我正在尝试使用 COPY 命令将 avro 文件复制到 redshift。该文件有一个类型的列:

{'name': 'timestamp', 'type': ['null', {'logicalType': 'timestamp-millis', 'type': 'long'}]}],

Redshift variable type: "timestamp" timestamptz

当我运行以下命令复制失败时:

COPY table_name 
from 'fil_path.avro' 
iam_role 'the_role' 
FORMAT AS avro 'auto' 

raw field value: 1581306474335

Invalid timestamp format or value [YYYY-MM-DD HH24:MI:SSOF]

但是,如果我添加以下行它会起作用:

timeformat 'epochmillisecs'

我试图将我的时间戳以微秒为单位,这应该是基本支持的纪元分辨率,但它也失败了,并且没有找到合适的名称(epochmicrosecs 似乎没有完成这项工作)。 我的问题是为什么会这样?

此外,我还有另一个字段导致了一些问题。显然在 avro 文件 (7305) 中保存为天数的日期字段出现以下错误:

Redshift variable type: "birthdate" date

avro: 'date_of_birth', 'type': ['null', {'type': 'int', 'logicalType': 'date'}]}

Invalid Date Format - length must be 10 or more

Firstly, about the Time Format:

如文档所述:

COPY command attempts to implicitly convert the strings in the source data to the data type of the target column. If you need to specify a conversion that is different from the default behavior, or if the default conversion results in errors, you can manage data conversions by specifying the following parameters.

First Solution:

Redshift 默认无法识别 epoch 时间,无法将其转换为 TimeStamp 格式,因此无法从中提取年、月、日等epoch 时间将它们放入 TimeStamp Format,如文档所述:

If your source data is represented as epoch time, that is the number of seconds or milliseconds since January 1, 1970, 00:00:00 UTC, specify 'epochsecs' or 'epochmillisecs'.

This is the supported Formats that Redshift can convert Using automatic recognition.

  • TimeStamp 需要格式为 YYYYMMDD HHMISS = 19960108 040809 才能正确提取,这就是错误状态 Invalid timestamp format or value [YYYY-MM-DD HH24:MI:SSOF],而 epoch 时间格式只是 seconds or milliseconds since January 1, 1970 它不明白如何从中提取它的值。
  • microseconds 在 Redshift 中不支持作为 TIMEFORMAT 的参数。

Second Solution:

  1. 您不需要将 TIMEFORMAT 传递给 COPY 命令,但您将在临时表中插入 epoch 时间作为 VARCHARTEXT.
  2. 然后,当将 epoch 时间从临时表插入模式表时,将其转换为:TIMESTAMP 'epoch' + epoch_time/1000 * interval '1 second' AS time

Secondly, about date field:

  • DATE 数据类型指定为 Calendar date (year, month, day),如 Docs, 所述,因此它不能是天数或长度不能少于 10 个字符 ( as 2021-03-04) 这就是错误告诉我们的内容 Invalid Date Format - length must be 10 or more.

The solution for Date field:

  1. 您需要通过将 number of days 作为 VARCHARtext 传递到暂存表来进行变通。
  2. 从暂存表加载架构表时,通过使用 TOCHARnumber of days 转换为 DATE 应用数据清理:TO_DATE(TO_CHAR(number of days, '9999-99-99'),'YYYY-MM-DD')
  • 因此,number of days 在您的 schema tables 中将是一个有效的 DATE