如何在 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 排序