此Hive查询需要建议

时间:2013-09-16 21:11:23

标签: hive hiveql

我有一个包含5个ID列的select语句。我需要从存储ID /名称的Customer主表中查找并选择相应的客户名称,然后提供客户报告。表格列如下: origCustomerID,Tier1PartnerID,Tier2PartnerID,DistributorId,EndCustomerID,productId,OrderTotal,OrderDate

前5列是与Customers表中的CustID列匹配的ID列。请注意,并非所有这些列都将始终包含给定记录的值,即它们有时可能为空。鉴于hiveQL当前的限制,我只能想到以下方式,但这需要花费大量时间,而不是最好的方法。你能否建议对此进行改进?

Select origCustomerID,a.name,Tier1PartnerID,b.name,Tier2PartnerID,
c.name,DistributorId,d.name,EndCustomerID,e.name,productId,OrderTotal,OrderDate 
From Orders O
LEFT OUTER JOIN customers a on o.origCustomerID = a.custid
LEFT OUTER JOIN customers b on o.Tier1PartnerID = a.custid
LEFT OUTER JOIN customers c on o.Tier2PartnerID = a.custid
LEFT OUTER JOIN customers d on o.DistributorId = a.custid
LEFT OUTER JOIN customers e on o.EndCustomerID = a.custid

1 个答案:

答案 0 :(得分:0)

如果id值始终是客户ID或NULL(即,如果它们不是NULL,您确定它们是客户ID而不是其他内容)并且{{1}中的每条记录都是Orders 1}}表最多匹配一个客户(即每个记录在这五列中最多只有一个id;或者可能多次使用相同的id),您可以在匹配表达式中使用COALESCE

我目前无法对此进行测试,但是应该使用NULL表中的第一个非Orders ID来加入记录。

SELECT [stuff]
FROM Orders O
LEFT OUTER JOIN customers a
ON COALESCE(o.origCustomerID, 
            o.Tier1PartnerID, 
            o.Tier2PartnerID, 
            o.DistributorId, 
            o.EndCustomerID) = a.custid

希望有所帮助。