使用UNION ALL和RANK有序优化Hive查询

时间:2019-04-04 12:42:08

标签: sql hadoop hive query-optimization hiveql

当前场景: 我有这个查询对两个数据集都进行联合,然后根据排名选择字段 但是根据我的分析,可以在UNION的一侧删除整个数据集

分析: 因此,如果您看下面的查询-我想,我们可以完全忽略并删除由表的联接生成的数据集:P,Q,R,S和T

我也可以在这里用union替换unionall

查询:

SELECT OUTERV.f1, ... OUTERV.f30
FROM 
      (
        SELECT 
          unionV.f1, ...unionV.f30, ROW_NUMBER() over (PARTITION BY unionV.ifc order by  unionV.orderNUM_ asc) rank_
        FROM 
          (
            SELECT f1 .. few fields, 1 as ORDERNUM_ 
            FROM 
            A 
            JOIN B on A.id = B.id 
            JOIN ( SELECT few remaining fields FROM C )  
            C ON C.id = B.id
            JOIN D ON C.id = D.id
            JOIN E ON E.id = D.id
            JOIN F on F.id = E.id
            UNION ALL 
            SELECT 
              f1, f2, ...f30 , 2 as ORDERNUM_ 
            FROM 
            P 
            JOIN Q ON P.id = Q.id
            JOIN R ON Q.id = R.id
            JOIN S on S.id = R.id
            JOIN T on S.id = T.id

          )unionV
      ) 
OUTERV where 
OUTERV.rank_ = 1

请求: 请确认我的分析是否正确。

1 个答案:

答案 0 :(得分:1)

我不同意分析;它做出的假设可能不正确。但是,如果可以保证联盟第二部分中的所有IFC值都存在于联盟的第一部分中,并且总是这样,那么您的分析是正确的。

  

实质上,您所执行的查询信任来自   第一组工会比第二组工会更多。   但是,如果第二组中没有IFC值,则第一组中不存在;它必须来自工会的第二部分;因此,删除联合的第二部分可能会删除记录。

示例:

  • 假设unionV.ifc来自联合的每一侧的表AP
  • 假设AP中的以下数据

A.ifc
A
B

P.ifc
A
Z

在您当前的查询中,结果将是

A (from A table)
B (from A table)
Z (from P Table)  

如果消除并集的第二部分,则消除P,因此Z将被排除在结果之外;因此它们不相等,因此您无法删除并集的第二部分。

现在,如果第二个集合中定义的所有ifc都包含在由联合定义的第一个集合中,那就总是如此;那是的,您可以消除工会的第二部分。由于第一组包含完整组,因此排在第一位。但是,如果这不能保证是真实的陈述,那么当前在... F和P ... T上使用并集的方法将生成“主集”