#hive #timestamp #impala
Вопрос:
У меня есть мастер и промежуточные таблицы, как показано ниже в УЛЬЕ:
У нас есть две промежуточные таблицы, скажем, в которых записи поступают каждые 10 минут.
впервые все данные, которые когда-либо присутствовали в промежуточных таблицах, передаются в главную таблицу с помощью приведенной ниже инструкции.
select * from Staging table-1 union all select * from Staging table-2
со следующего раза , только если метка времени, присутствующая в основной таблице, меньше, чем метка времени в промежуточной(т. е. последняя запись), должна быть добавлена в основную таблицу, иначе добавления не будет.
Т. е. метка времени должна сравниваться и только в том случае, если она последняя, должна быть добавлена, иначе нет.
и все эти таблицы создаются с помощью инструкций Create external и Insert.
Я застрял в том, как сравнить каждую временную метку определенной группы с соответствующей промежуточной таблицей.
Я новичок в улье, пожалуйста, помогите мне.
Заранее спасибо
Ответ №1:
Я могу придумать два варианта.
Вариант 1 — если вы можете добавить новый столбец в основную таблицу под названием record_created_by, чтобы отслеживать, на каком этапе создаются данные. И ваше заявление о вставке будет выглядеть так
select s.*, 'stage1' as record_created_by from Staging table-1 s Join (select max(timestamp) mxts from master where record_created_by='stage1') mx On timestamp gt; mxts union all select s.*, 'stage2' as record_created_by from Staging table-2 s Join (select max(timestamp) mxts from master where record_created_by='stage2') mx On timestamp gt; mxts
Пожалуйста, обратите внимание, что ваше первое заявление о вставке будет таким же, как и в sql, но без части метки времени. Если у вас несколько этапов, вы можете добавить их, как этот sql.
Вариант 2 — если вы не можете изменить существующую структуру основной таблицы, вы можете создать новую таблицу, чтобы сохранить максимальное время дат для каждой группы. Таблица должна быть такой
stages, mxts stage1, 2021-01-01 12:30:30 ...
Затем используйте его в sql, аналогично приведенному выше sql.
select * from Staging table-1 s Join maxtimestamp On timestamp gt; mxts and stages='stage1' union all select * from Staging table-2 s Join maxtimestamp On timestamp gt; mxts and stages='stage2'
А затем вставляйте максимальную временную метку в эту таблицу каждый день после загрузки.
Второй вариант быстрее, но вам нужно создать и поддерживать новую таблицу.
Комментарии:
1. Спасибо @Koushik Roy. Я застрял в применении этой идеи к запросу. Твой ответ помог.
2. рад, что это помогло…