通过准确插入的时间戳在 Hive 中进行动态分区

Dynamic partitioning in Hive through the exact inserted timestamp

我需要将数据插入到给定的外部 table 中,该数据应按插入日期进行分区。 我的问题是 Hive 如何处理时间戳生成?当我 select 所有插入记录的时间戳时,如下所示:

WITH delta_insert AS (
        SELECT trg.*, from_unixtime(unix_timestamp()) AS generic_timestamp
        FROM target_table trg
        )
SELECT *
FROM delta_insert;

所有记录的时间戳是否始终相同,即使查询需要很长时间才能取消?

或者我是否应该仅 select 一个实际的时间戳并将其与之后 select 编辑的所有内容相结合?

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;

由于不建议在 Hive 中进行交叉连接,我想知道最好的方法是什么,因为我没有足够的测试数据来模拟长 运行 查询以确保将它们插入其中增量负载的同一分区。

不,使用 unix_timestamp() 生成的时间戳不会对所有记录始终相同。此函数是不确定的,并且会阻止查询的适当优化 - 自 2.0 以来已弃用此函数,取而代之的是 CURRENT_TIMESTAMP 常量(只为查询计算一次)。请参阅此文档:Date functions 这不适用于带参数的 unix_timestamp(string date)unix_timestamp(string date) 函数是确定性的。

current_timestamp returns 查询评估开始时的当前时间戳(从 Hive 1.2.0 开始)。同一查询 return 中对 current_timestamp 的所有调用都具有相同的值。 如果需要日期,请使用 current_date 函数。