Как реализовать LEFT / RIGHT OUTER JOIN для замены NOT IN в запросе улья? - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть две таблицы в Hive: empSrc и empTrg:

> select * from empSrc;
+---------------+--------------+-------------+--------------+--+
| empsrc.empid  | empsrc.dept  |  empsrc.ph  | empsrc.role  |
+---------------+--------------+-------------+--------------+--+
| e1            | dev          | 9999911111  | SE           |
| e2            | admin        | 6677889933  | SE           |
+---------------+--------------+-------------+--------------+--+
2 rows selected (0.872 seconds)
> select * from empTrg;
+---------------+--------------+-------------+--------------+--------------------+----------------+--+
| emptrg.empid  | emptrg.dept  |  emptrg.ph  | emptrg.role  | emptrg.dml_action  | emptrg.active  |
+---------------+--------------+-------------+--------------+--------------------+----------------+--+
| e1            | dev          | 9999911111  | SE           | I                  | A              |
+---------------+--------------+-------------+--------------+--------------------+----------------+--+

Я хочу найти записи, которые находятся в empSrc , но отсутствуют в empTrg.
Мой запрос работает нормально:

select S.* from empSrc S
where S.empid not in (select T.empid from empTrg T);
+----------+---------+-------------+---------+--+
| s.empid  | s.dept  |    s.ph     | s.role  |
+----------+---------+-------------+---------+--+
| e2       | admin   | 6677889933  | SE      |
+----------+---------+-------------+---------+--+

Проблема в том, что этот запрос создает перекрестный продукт.
Существует ли какой-либо эквивалентный LEFT OUTER JOIN запрос, который я могу использовать?
Поможет ли LEFT / RIGHT OUTER JOIN в производительности?
Приведенный выше сценарий является демонстрационным, в реальных данных у меня ~ 12 миллионов записей.

1 Ответ

0 голосов
/ 11 декабря 2018

Запрос select S.* from empSrc S where S.empid not in (select T.empid from empTrg T) фактически не выполняет перекрестное соединение.С этим проблем нет.

Та же логика может быть скопирована с not exists

select s.*
from empSrc s 
where not exists (select 1 from empTrg t where t.empid = s.empid)

или left join.

select s.*
from empSrc s
left join empTrg t on t.empid = s.empid
where t.empid is null --condition to check for non existent records
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...