【发布时间】:2016-12-13 19:07:06
【问题描述】:
MySQL can automatically record created_at and updated_at timestamps. Hive 是否提供类似的机制?如果没有,实现此功能的最佳方法是什么?
【问题讨论】:
标签: sql datetime hive timestamp hiveql
MySQL can automatically record created_at and updated_at timestamps. Hive 是否提供类似的机制?如果没有,实现此功能的最佳方法是什么?
【问题讨论】:
标签: sql datetime hive timestamp hiveql
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 的值还会改变吗?