将时间戳格式从 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:
- 您不需要将
TIMEFORMAT
传递给 COPY
命令,但您将在临时表中插入 epoch
时间作为 VARCHAR
或 TEXT
.
- 然后,当将
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:
- 您需要通过将
number of days
作为 VARCHAR
或 text
传递到暂存表来进行变通。
- 从暂存表加载架构表时,通过使用
TOCHAR
将 number of days
转换为 DATE
应用数据清理:TO_DATE(TO_CHAR(number of days, '9999-99-99'),'YYYY-MM-DD')
- 因此,
number of days
在您的 schema tables
中将是一个有效的 DATE
。
我正在尝试使用 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:
- 您不需要将
TIMEFORMAT
传递给COPY
命令,但您将在临时表中插入epoch
时间作为VARCHAR
或TEXT
. - 然后,当将
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:
- 您需要通过将
number of days
作为VARCHAR
或text
传递到暂存表来进行变通。 - 从暂存表加载架构表时,通过使用
TOCHAR
将number of days
转换为DATE
应用数据清理:TO_DATE(TO_CHAR(number of days, '9999-99-99'),'YYYY-MM-DD')
- 因此,
number of days
在您的schema tables
中将是一个有效的DATE
。