我需要将数据插入到给定的外部表中,该表应按插入日期进行分区。我的问题是hive如何处理时间戳生成?当我为所有插入的记录选择时间戳时,如下所示:
WITH delta_insert AS (
SELECT trg.*, from_unixtime(unix_timestamp()) AS generic_timestamp
FROM target_table trg
)
SELECT *
FROM delta_insert;
即使查询需要很长时间才能取消,所有记录的时间戳是否总是相同的?
或者我应该只选择一个实际的时间戳,并将它与之后选择的所有内容连接起来吗?
WITH insert_timestamp AS (
SELECT from_unixtime(unix_timestamp()) AS insert_timestamp
),
delta_insert AS (
SELECT trg.*, insert_timestamp.insert_timestamp
FROM target_table trg, insert_timestamp
)
SELECT *
FROM delta_insert;
由于不建议在配置单元中执行交叉连接,我想知道什么是最好的方法,因为我没有足够的测试数据来模拟长时间运行的查询,以确保它们插入到增量负载的同一分区中。
1条答案
按热度按时间woobm2wo1#
不,对于所有记录,使用unix\u timestamp()生成的时间戳并不总是相同的。此函数是不确定的,并阻止对查询进行适当的优化-自2.0以来,此函数一直被弃用,取而代之的是current\u timestamp常量(只为查询计算一次)。请参阅此文档:日期函数,此项不适用
unix_timestamp(string date)
有争论。unix_timestamp(string date)
函数是确定的。current_timestamp
返回查询求值开始时的当前时间戳(从Hive1.2.0开始)。同一查询中当前时间戳的所有调用都返回相同的值。如果需要日期,请使用current_date
功能。