Amazon redshift 将时间戳格式从avro复制到红移
我正在尝试使用copy命令将avro文件复制到红移。该文件具有以下类型的列: {'name':'timestamp', 'type':['null',{'logicalType':'timestamp millis','type':'long'}]} 红移变量类型:“timestamp”timestamp 运行以下命令时,如果复制失败:Amazon redshift 将时间戳格式从avro复制到红移,amazon-redshift,avro,Amazon Redshift,Avro,我正在尝试使用copy命令将avro文件复制到红移。该文件具有以下类型的列: {'name':'timestamp', 'type':['null',{'logicalType':'timestamp millis','type':'long'}]} 红移变量类型:“timestamp”timestamp 运行以下命令时,如果复制失败: COPY table_name from 'fil_path.avro' iam_role 'the_role' FORMAT AS avro 'auto
COPY table_name
from 'fil_path.avro'
iam_role 'the_role'
FORMAT AS avro 'auto'
原始字段值:1581306474335
无效的时间戳格式或值[YYYY-MM-DD HH24:MI:SSOF]
但是,如果我添加以下行,它将起作用:
timeformat 'epochmillisecs'
我尝试将时间戳设置为微秒,这应该是基本支持的历元分辨率,但也失败了,并且没有找到合适的名称(epochmicrosecs似乎没有完成这项工作)。
我的问题是为什么会这样
此外,我有另一个领域,这是造成一些问题。在avro文件(7305)中以天数形式保存的日期字段,会出现以下错误:
红移变量类型:“生日”日期
avro:'出生日期','类型':['null',{'type':'int','logicalType':'date'}]}
无效的日期格式-长度必须为10或更多
首先,关于时间格式:
正如文件所述:
COPY命令尝试将源数据中的字符串隐式转换为目标列的数据类型。如果需要指定与默认行为不同的转换,,或者如果默认转换导致错误,则可以通过指定以下内容来管理数据转换
第一个解决方案:
红移默认情况下不识别历元
时间,无法将其转换为时间戳
格式,因此无法从历元
时间中提取年、月、日..等,将其转换为时间戳格式
,如文档所述:
如果源数据表示为历元时间,即自1970年1月1日00:00:00 UTC以来的秒数或毫秒数,请指定“历元秒”或“历元秒”
TimeStamp
需要格式为YYYYMMDD HHMISS=19960108 040809
才能正确提取,这就是错误状态无效的时间戳格式或值[YYYY-MM-DD HH24:MI:SSOF]
,而epoch
时间格式从1月1日起仅为秒或毫秒,1970
它不知道如何从中提取其值
微秒
不支持作为红移中时间格式
的参数
第二种解决方案:
您不需要将TIMEFORMAT
传递给COPY
命令,但可以将epoch
时间作为VARCHAR
或TEXT
插入暂存表中
然后,当从暂存表向模式表中插入epoch
time时,将其如下转换:TIMESTAMP'epoch'+epoch\u time/1000*间隔'1秒'作为时间
第二,关于日期字段:
DATE
数据类型被指定为日历日期(年、月、日)
,如所述,因此它不能是天数或长度小于10个字符(如2021-03-04),这就是错误告诉我们的无效日期格式-长度必须大于等于10
日期字段的解决方案:
您需要通过将天数
作为VARCHAR
或文本
传递到暂存表中来进行变通
从暂存表加载架构表时,通过使用TOCHAR
:to_DATE(to_CHAR(天数,'9999-99'),'YYYY-MM-DD')将天数转换为日期,应用数据清理。
- 因此,
天数
将是架构表中的有效日期
我不知道我的解决方案为什么有效。我也有同样的问题(日期与纪元后的天数相同)。我以文本“2020-02-01”的形式传递了日期,结果成功了。