转换之间的配置单元中的左联接导致行数减少



hi这是我在impala中的查询。我需要将其转换为蜂窝

Select count(*)
FROM  ud_planning.WIM_MF2_Temp as MF
LEFT JOIN 
ud_planning.WIM_PDA_Temp as PDA
on  PDA.materialnum = MF. materialnum 
and   MF.loaddate between PDA.FromDate  and PDA.Todate 

结果:61664421行。

我的蜂窝版本:

Select count(*)
FROM  ud_planning.WIM_MF2_Temp as MF
LEFT JOIN 
ud_planning.WIM_PDA_Temp as PDA
on  PDA.materialnum = MF. materialnum 
where  (MF.loaddate >= PDA.FromDate   and MF.loaddate <= PDA.Todate)
or PDA.materialnum is  null

结果:59184964行。

如何在不丢失行的情况下写这篇文章?

您可以将筛选条件移动到where子句:

Select count(*)
from ud_planning.WIM_MF2_Temp MF left join
ud_planning.WIM_PDA_Temp PDA
on PDA.materialnum = MF.materialnum and
MF.loaddate >= PDA.FromDate and
MF.loaddate <= PDA.Todate;

哦,这是您的第一个查询——由于on子句中的不等式,我认为它在Hive中不起作用。

在您试图相加的两个表之间有三种可能的条件:

  1. 材质匹配,时间框架匹配
  2. 材料匹配,有时间框架,但没有匹配
  3. 没有材料匹配

您的第二个查询只得到(1(和(3(。第二个问题相当棘手,因为没有on子句的灵活性。您可以使用进行计算

select count(*)
from (select count(*)
from ud_planning.WIM_MF2_Temp MF join
ud_planning.WIM_PDA_Temp PDA
on PDA.materialnum = MF.materialnum
group by MF.materialnum
having sum(case when MF.loaddate >= PDA.FromDate and MF.loaddate <= PDA.Todate then 1 else 0 end) = 0
) MF;

尽管我认为这在Hive中不起作用,但另一种配方是:

select count(*)
from ud_planning.WIM_MF2_Temp MF
where not exists (select 1
from ud_planning.WIM_PDA_Temp PDA
where PDA.materialnum = MF.materialnum and
MF.loaddate >= PDA.FromDate and MF.loaddate <= PDA.Todate
);

这些给了你可以添加回来的差异。

最新更新