如何在 Hive 中记录 created_at 和 updated_at 时间戳?

Posted

技术标签:

【中文标题】如何在 Hive 中记录 created_at 和 updated_at 时间戳?【英文标题】:How to record created_at and updated_at timestamps in Hive? 【发布时间】:2016-12-13 19:07:06 【问题描述】:

mysql can automatically record created_at and updated_at timestamps. Hive 是否提供类似的机制?如果没有,实现此功能的最佳方法是什么?

【问题讨论】:

【参考方案1】:

Hive 不提供这种机制。您可以通过在您的选择中使用 UDF 来实现此目的:from_unixtime(unix_timestamp()) as created_at。请注意,这将在每个 mapper 或 reducer 中执行,并且可能返回不同的值。如果您需要所有数据集的相同值(对于 1.2.0 之前的 Hive 版本),请将变量传递给脚本并在内部使用:'$hiveconf:created_at' as created_at

更新current_timestamp 返回查询评估开始时的当前时间戳截至 Hive 1.2.0)。同一查询中对 current_timestamp 的所有调用都返回相同的值。 unix_timestamp() 以秒为单位获取当前的 Unix 时间戳。此函数是非确定性的,并且会阻止对查询的适当优化 - 自 2.0 以来已弃用此函数,而支持 CURRENT_TIMESTAMP 常量。所以,它不是一个函数,它是一个常数! 请参阅此文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

对于 hive 查询,当您重写表或分区或插入时,最好使用 CURRENT_TIMESTAMP,因为无论如何都要重写所有文件,而不是记录,因此 created_at 时间戳应该是相同的。

【讨论】:

如果我使用current_timestamp() 而不是unix_timestamp(),每个mapper/reducer 的值还会改变吗? 不会改变。文档说 current_timestamp 在查询评估开始时返回当前时间戳(从 Hive 1.2.0 开始)。同一查询中对 current_timestamp 的所有调用都返回相同的值。谢谢这个问题。我会相应地改变我的答案

以上是关于如何在 Hive 中记录 created_at 和 updated_at 时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

当有大约 100 万条记录时,如何在 Java 中比较 Hive 和 Cassandra 数据

如何在数据库中获取原始的“created_at”值(不是转换为 ActiveSupport::TimeWithZone 的对象)

Laravel在插入新记录时在created_at和updated_at中放置null

在 Postgresql 中查找最近的不同记录并按 created_at 排序

Laravel / Moment - 如何确定夏令时期间是不是 created_at?

Rails 4.2 - 最后一条记录的#created_at是否超过1天?