Я хочу обновить существующие данные, если они существуют, на основании какого-либо условия (данные с более высоким приоритетом должны быть обновлены) и вставить новые данные, если они не существуют.
Я уже написал запрос для этого, но каким-то образом он дублирует количество строк. Вот полное объяснение того, что я имею и чего хочу достичь:
Что у меня есть:
Таблица 1 - столбцы - идентификатор, информация, приоритет
hive> select * from sample1;
OK
1 123 1.01
2 234 1.02
3 213 1.03
5 213423 1.32
Time taken: 1.217 seconds, Fetched: 4 row(s)
Таблица 2: столбцы - идентификатор, информация, приоритет
hive> select * from sample2;
OK
1 1234 1.05
2 23412 1.01
3 21 1.05
4 1232 1.1
2 3432423 1.6
3 34324 1.4
Я хочу, чтобы в итоговой таблице была только 1 строка на идентификатор с данными в соответствии с наибольшим приоритетом:
1 1234 1.05
2 3432423 1.6
3 34324 1.4
4 1232 1.1
5 213423 1.32
Я написал следующий запрос:
insert overwrite table sample1
select a.id,
case when cast(TRIM(a.prio) as double) > cast(TRIM(b.prio) as double) then a.info else b.info end as info,
case when cast(TRIM(a.prio) as double) > cast(TRIM(b.prio) as double) then a.prio else b.prio end as prio
from sample1 a
join
sample2 b
on a.id=b.id where b.id in (select distinct(id) from sample1)
union all
select * from sample2 where id not in (select distinct(id) from sample1)
union all
select * from sample1 where id not in (select distinct(id) from sample2);
После выполнения этого запроса я получаю следующий результат:
hive> select * from sample1;
OK
1 1234 1.05
2 234 1.02
3 21 1.05
2 3432423 1.6
3 34324 1.4
5 213423 1.32
4 1232 1.1
Как изменить текущий запрос для достижения правильного результата. Есть ли другой метод / процесс, которым я могу следовать, чтобы достичь конечного результата. Я использую hadoop 2.5.2 вместе с HIVE 1.2.1. Я работаю на кластере из 6 узлов с 5 подчиненными и 1 NN.