Hive 解决方法中的非等左外连接
Non equi Left outer join in hive workaround
如何在涉及两个以上表的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 [就像等值连接一样]。
如何在配置单元中实现这样的东西:
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);
请指导我解决这个问题。
谢谢。
你可以非常接近:
where (cs.SEND >= ins.IDAT AND cs.SEND < ins.RDAT) or
(ins.IDAT is null)
或者,我认为您可以使用两个查询,一个用于匹配,一个用于 non-matches。
如何在涉及两个以上表的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 [就像等值连接一样]。
如何在配置单元中实现这样的东西:
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);
请指导我解决这个问题。
谢谢。
你可以非常接近:
where (cs.SEND >= ins.IDAT AND cs.SEND < ins.RDAT) or
(ins.IDAT is null)
或者,我认为您可以使用两个查询,一个用于匹配,一个用于 non-matches。