Сравните метки времени для определенной группы в основной таблице с соответствующей промежуточной таблицей той же группы

#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. рад, что это помогло…