hive解决方法中的非equi左外连接

时间:2016-01-22 09:41:15

标签: hive left-join

如何在涉及两个以上表的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;

问题:

条件不匹配的记录已跳过。 [As,Hive不支持使用条件的非equi连接]

要求:

与条件不匹配的记录应将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);

请指导我解决此问题。

三江源。

1 个答案:

答案 0 :(得分:0)

你可以非常接近:

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

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