时间戳未从 Glue 加载到 Redshift 表中

Posted

技术标签:

【中文标题】时间戳未从 Glue 加载到 Redshift 表中【英文标题】:Timestamp not Loading into Redshift Table from Glue 【发布时间】:2018-08-17 17:08:12 【问题描述】:

我在存储在 S3 中的 csv 文件中有一个 YYYY-MM-DD XX:XX:XX 格式的时间戳,但是当我使用时间戳数据类型通过 Glue 加载到 Redshift 数据库时,时间戳列为空。格式似乎是有效的,但我也尝试过 YYYYMMDD XXXXXXYYMMDD XX:XX:XX 格式,也只是 incase。

我在 Glue 中的映射是从时间戳到时间戳,并且表的列数据类型也是时间戳。 csv格式的数据示例:

1,2016 Summer,2016-06-22 00:00:00

实际输出:

Line |    Term     |    Date
-----+-------------+------------
   1 | 2016 Summer |  

预期输出:

Line |    Term     |        Date
-----+-------------+---------------------
   1 | 2016 Summer | 2016-06-22 00:00:00

这似乎应该是一项简单的任务,但我无法正确完成,所以如果其他人能找到我的错误,将不胜感激。

代码:

val datasource37 = glueContext.getCatalogSource(database = "data", tableName = "term", redshiftTmpDir = "", transformationContext = "datasource37").getDynamicFrame()
val applymapping37 = datasource37.applyMapping(mappings = Seq(("id", "bigint", "id", "bigint"), ("name", "string", "name", "varchar(256)"), ("date", "timestamp", "date_start", "timestamp")), caseSensitive = false, transformationContext = "applymapping37")
val resolvechoice37 = applymapping37.resolveChoice(choiceOption = Some(ChoiceOption("make_cols")), transformationContext = "resolvechoice37")
val dropnullfields37 = resolvechoice37.dropNulls(transformationContext = "dropnullfields37")
val datasink37 = glueContext.getJDBCSink(catalogConnection = "dataConnection", options = JsonOptions(""""dbtable": "term", "database": "data""""), redshiftTmpDir = args("TempDir"), transformationContext = "datasink37").writeDynamicFrame(dropnullfields37)

【问题讨论】:

你能添加你的 Glue 脚本吗? 是的,我现在编辑了我的问题以包含它。 【参考方案1】:

我最终从字符串 -> 时间戳映射,它工作。 Glue 会自动从时间戳映射 -> 时间戳,所以我认为它是正确的。

例如:

val applymapping37 = datasource37.applyMapping
                     (mappings = Seq(("id", "bigint", "id", "bigint"),
                     ("name", "string", "name", "varchar(256)"), 
                     ("date", "string", "date_start", "timestamp")),
                     caseSensitive = false, transformationContext = "applymapping37")

【讨论】:

以上是关于时间戳未从 Glue 加载到 Redshift 表中的主要内容,如果未能解决你的问题,请参考以下文章

将 Parquet 文件从 AWS Glue 加载到 Redshift

AWS Glue - Redshift 中具有 Json 结构的字段

如何在数据加载之前截断 AWS Glue 作业中的 RDS 表?

从 AWS Glue 表到 RedShift Spectrum 外部表的日期字段转换

如何编写 AWS Glue 脚本以将新数据插入 Redshift 表

AWS Glue ETL 到 Redshift:日期