Тета присоединиться в Улей - PullRequest
0 голосов
/ 17 января 2020

У меня есть тэта-соединение в SAS, которое необходимо перевести в Hive.

SAS:

select a.id,b.name from employee a 
left outer join company b 
on ( a.id=b.id and a.joindate>=b.joindate and a.releasedate < b.releasedate)

Поскольку это не внутреннее соединение, я не получу надлежащих результатов, если я добавьте non equi-join в условие where (все несоответствующие записи из левой таблицы отсутствуют).

Попробовал ниже в Hive:

select a.id,b.name from employee a 
left outer join company b 
on ( a.id=b.id) 
where a.joindate>=b.joindate and a.releasedate < b.releasedate

Есть предложения?

1 Ответ

0 голосов
/ 20 января 2020

Как вы, наверное, поняли, left join сохраняет все элементы из таблицы сохраненных рядов (сотрудник), тогда как ваш where отфильтровывает эти элементы, если a.joindate<b.joindate or a.releasedate >= b.releasedate.

Эти on условия логически интерпретируются как:

  1. Для каждого элемента li из левой таблицы, всякий раз, когда элемент ri из правой таблицы найдено соответствие условиям on, создайте новый элемент ni, значения столбцов которого представляют собой комбинацию li и ri. Затем поместите ni в набор результатов. Это может дублировать строки из левой таблицы.
  2. Если li не удается найти соответствие, сделайте одну его копию, заполните правые столбцы нулями. Поместите этот элемент также в набор результатов.

Таким образом, мы можем эмулировать это поведение следующим образом:

  1. Ослабьте условия on, сохраняя только условия равенства в предложении on;
  2. Отфильтровывать дополнительные строки, вызванные ослабленными условиями on, т. е. строки, которые не удовлетворяют условиям, отличным от условий равенства.

Результирующий запрос может выглядеть так:

select 
    a.id,
    b.name
from employee a 
left outer join company b 
on (a.id=b.id)
where (b.id is null 
       or (a.joindate>=b.joindate and a.releasedate<b.releasedate))
...