Theta 加入 Hive
Posted
技术标签:
【中文标题】Theta 加入 Hive【英文标题】:Theta join in Hive 【发布时间】:2020-01-17 12:31:28 【问题描述】:我在 SAS 中有一个 theta 连接,需要翻译成 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)
由于这不是内连接,如果我在 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】:正如您可能已经意识到的那样,left join
保留保留行表(员工)中的所有项目,而您的 where
如果 a.joindate<b.joindate or a.releasedate >= b.releasedate
过滤掉这些项目。
那些on
条件在逻辑上被解释为:
对于左表中的每一项
li
,只要发现右表中的某项ri
满足on
条件,就新建一个ni
,其列值为@987654329的组合@ 和ri
。然后将ni
放入结果集中。这可能会重复左表中的行。 如果li
找不到匹配项,请复制一份,用空值填充右列。将此项目也放入结果集中。
所以我们可以通过以下方式模拟这种行为:
通过在
on
子句中保留相等条件来放松on
条件; 过滤掉由宽松的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))
【讨论】:
以上是关于Theta 加入 Hive的主要内容,如果未能解决你的问题,请参考以下文章