在Hive中的日期范围上连接表

时间:2016-03-11 16:14:21

标签: sql hadoop hive left-join

我需要在employee_id上​​将tableA连接到tableB,并且表A中的cal_date需要在表B的日期开始和结束日期之间。我运行下面的查询并收到以下错误消息,请你帮我纠正和查询。谢谢你的帮助!

在JOIN' date_start' 中遇到左右别名。

select a.*, b.skill_group 
from tableA a 
  left join tableB b 
    on a.employee_id= b.employee_id 
    and a.cal_date >= b.date_start 
    and a.cal_date <= b.date_end

3 个答案:

答案 0 :(得分:3)

RTFM - 引用LanguageManual Joins

  

Hive不支持非平等条件的连接条件   因为很难表达map / reduce这样的条件   工作

您可能会尝试将BETWEEN过滤器移动到WHERE子句,从而导致糟糕的部分笛卡尔连接,然后进行后处理清理。呸。根据“技能组”表的实际基数,它可以快速工作 - 或者整天工作。

答案 1 :(得分:0)

如果情况允许,请在两个查询中进行操作。

首先具有完全联接,可以具有范围;然后使用外部联接,在所有列上都匹配,但要包括where子句,其中其中一个字段为null。

例如:

create table tableC as
select a.*, b.skill_group 
    from tableA a 
    ,    tableB b 
    where a.employee_id= b.employee_id 
      and a.cal_date >= b.date_start 
      and a.cal_date <= b.date_end;

with c as (select * from TableC)
insert into tableC
select a.*, cast(null as string) as skill_group
from tableA a 
  left join c
    on (a.employee_id= c.employee_id 
    and a.cal_date  = c.cal_date)
where c.employee_id is null ;

答案 2 :(得分:0)

MarkWusinich有一个很好的解决方案,但有一个重大问题。如果表a在日期范围内两次具有雇员ID,则表c还将具有两次雇员ID(如果b是唯一的,如果不是唯一的话),则在联接后创建4条记录。因此,如果A在employee_ID上不是唯一的,则必须使用group by。更正如下:

with C as
(select a.employee_id, b.skill_group 
    from tableA a 
    ,    tableB b 
    where a.employee_id= b.employee_id 
      and a.cal_date >= b.date_start 
      and a.cal_date <= b.date_end
group by a.employee_id, b.skill_group
) C
select a.*, c.skill_group
from tableA a 
left join c
  on a.employee_id = c.employee_id 
    and a.cal_date  = c.cal_date;

请注意:如果B有意在(employee_id,skill_group)上没有区别,那么我上面的查询也必须进行修改以适当地反映出来。