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&lt;b.joindate or a.releasedate &gt;= 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的主要内容,如果未能解决你的问题,请参考以下文章

Hivehive的高级操作

HiveHive初识

HiveHive 基础

Hivehive函数与hive shell

HiveHive 一些面试题

HiveHive Metrics体系