如何让红移为复制命令中指定的字段添加当前时间

Posted

技术标签:

【中文标题】如何让红移为复制命令中指定的字段添加当前时间【英文标题】:How to get redshift to add current time for a field specified in copy command 【发布时间】:2018-03-20 10:57:20 【问题描述】:

我有一个 TSV 文件,我想通过复制命令将其加载到 redshift 中。

我希望表中的一个字段是一个时间戳,用于记录该行的加载时间。

我已经定义了一个这样的字段:

ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP

如果我在 psql 命令行中插入该行,而不为该列指定值,这将正常工作 - 它默认为预期的当前时间戳。

但是,我的 TSV 文件中该列的哪些内容会导致 redshift 默认为当前时间戳?

如果我在我的 TSV 中使用 \N,那么我只会在 ts 字段中得到一个 NULL。

另一方面,如果我将列定义为 NOT NULL

ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL

然后我从 COPY 命令中收到一个错误,即我无法将 NULL 值插入 NOT NULL 字段。

mysql 上,mysql 会将 NULL 值转换为当前时间戳,但 redshift 的行为是抛出错误。

有什么建议吗?非常感谢!

【问题讨论】:

我想到了一个粗略的解决方法。对于 TSV 中的 \N 字段,我将在 redshift 中创建一个名为 dummy 的列并忽略它。但是我会在 redshift 表中添加一个在 TSV 文件中没有对应值的列,这将按预期更新为当前时间。有额外的冗余虚拟列很烦人。当然,我可以只更改 TSV,但由于其他原因,这需要大量返工。 您可以在加载文件后对其进行后处理以添加值吗? 【参考方案1】:

我一直在努力解决这个问题,并找到了一个部分解决方法:您可以将 ts 列作为表的最后一列,并将 TSV 文件与除此之外的所有其他列一起使用。该文件将与存在的列一起读取并加载到目标表中具有相同宽度的连续列列表中,为超出该宽度的所有列保留默认值,即您可以拥有id | ts 表并加载文件仅idts 将采用默认值。当前时间戳列通常是元数据列,因此可以将其放在表的末尾。

【讨论】:

谢谢,是的,这就是我最终所做的。如果您在复制命令中指定列名,我认为它甚至不必位于末尾(您可能知道这一点,但对于其他读者)。所以如果你有 a,b,c,ts 你可以只复制 mytable(a,b,c) 并​​且任何其他字段都将加载它们的默认值。

以上是关于如何让红移为复制命令中指定的字段添加当前时间的主要内容,如果未能解决你的问题,请参考以下文章

mongodb更新查询删除命令中指定的字段以外的所有数组字段

mongodb更新查询删除命令中指定的字段以外的所有数组字段

如何使用 R 中指定的列名创建空数据框? [复制]

如何解决本机 Java 或 Kotlin 中的错误“在依赖项的 AAR 元数据中指定的 minCompileSdk (31)”? [复制]

在构建 Java GraphQL API 时,如何避免从数据库中过度获取(即仅获取查询中指定的字段)?

用nodejs sequelize中指定的字段隐藏db中的一个结果。