Динамическое разбиение в Hive по точной вставленной метке времени - PullRequest
1 голос
/ 24 сентября 2019

Мне нужно вставить данные в заданную внешнюю таблицу, которая должна быть разбита по вставленной дате.Мой вопрос: как 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;

Поскольку не рекомендуется делать перекрестные объединения в Hive, мне интересно, какой будет лучший подход, поскольку я ненедостаточно тестовых данных для имитации длительных запросов, чтобы быть уверенными, что они вставлены в один и тот же раздел дельта-загрузки.

1 Ответ

2 голосов
/ 24 сентября 2019

Нет, временная метка, сгенерированная с помощью unix_timestamp (), НЕ всегда будет одинаковой для всех записей.Эта функция недетерминирована и предотвращает правильную оптимизацию запросов - с 2.0 она устарела в пользу константы CURRENT_TIMESTAMP (рассчитывается только один раз для запроса).См. Эту документацию: Функции даты Это не относится к unix_timestamp(string date) с аргументом.unix_timestamp(string date) функция является детерминированной.

current_timestamp возвращает текущую временную метку в начале оценки запроса (по состоянию на Hive 1.2.0).Все вызовы current_timestamp в одном запросе возвращают одно и то же значение.Если вам нужна дата, используйте функцию current_date.

...