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

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命令将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' 
原始字段值: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”的形式传递了日期,结果成功了。