繁体   English   中英

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

[英]Join Tables on Date Range in Hive

我需要在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

RTFM - 引用LanguageManual Joins

Hive 不支持不是相等条件的连接条件,因为很难将此类条件表示为 map/reduce 作业。

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

如果您的情况允许,请分两次查询。

首先是全连接,可以有范围; 然后使用外连接,匹配所有列,但包括一个 where 子句,其中一个字段为空。

前任:

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 ;

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),那么我上面的查询也必须修改以适当地反映这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM