[英]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.