【问题标题】:Non equi Left outer join in hive workaround配置单元解决方法中的非 equi 左外连接
【发布时间】:2016-01-22 09:41:15
【问题描述】:

如何在hive中实现两个以上表的非equi左外连接?

使用的查询:

SELECT cs.SID, ins.ID, a.ID, e.id, i.id, cs.dateId, cs.timeId,cs.SSTRT,cs.SEND,cs.VAL,cs.IND,cs.TYP,cs.DTPE,cs.BCDE, cs.IVAL,cs.ICNT,cs.RDT,cs.REJ 
from cs_item_hive cs 
LEFT outer JOIN installation_hive ins ON  (cs.SID=ins.SN)
LEFT OUTER JOIN account_hive a ON (ins.AID=a.ID AND ins.MDID = a.MDID)
LEFT OUTER JOIN equipment_hive e ON ins.GBLSID=e.GSN
LEFT OUTER JOIN item_hive i ON (cs.BCDE=i.ibc AND ins.MDID = i.MDID AND ins.AID = i.AID)
where cs.SEND >= ins.IDAT AND cs.SEND < ins.RDAT;

问题:

不符合 WHERE 条件的记录将被跳过。 [因为,Hive 不支持 non-equi join,其中使用了条件]

要求:

不符合条件的记录应将 ins.ID、a.ID、e.id、i.id 替换为 NULL [如同 equi-join]。

如何在 hive 中实现类似的东西:

SELECT cs.SID, ins.ID, a.ID, e.id, i.id, cs.dateId, cs.timeId,cs.SSTRT,cs.SEND,cs.VAL,cs.IND,cs.TYP,cs.DTPE,cs.BCDE, cs.IVAL,cs.ICNT,cs.RDT,cs.REJ 
from cs_item_hive cs 
LEFT outer JOIN installation_hive ins ON  (cs.SID=ins.SN AND cs.SEND >= ins.IDAT AND cs.SEND < ins.RDAT)
LEFT OUTER JOIN account_hive a ON (ins.AID=a.ID AND ins.MDID = a.MDID)
LEFT OUTER JOIN equipment_hive e ON ins.GBLSID=e.GSN
LEFT OUTER JOIN item_hive i ON (cs.BCDE=i.ibc AND ins.MDID = i.MDID AND ins.AID = i.AID);

请指导我解决此问题。

谢谢。

【问题讨论】:

    标签: hive left-join


    【解决方案1】:

    您可以非常接近:

    where (cs.SEND >= ins.IDAT AND cs.SEND < ins.RDAT) or
          (ins.IDAT is null)
    

    或者,我认为您可以使用两个查询,一个用于匹配,一个用于不匹配。

    【讨论】:

      猜你喜欢
      • 2020-09-30
      • 2021-05-28
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      相关资源
      最近更新 更多