【问题标题】:Optimizing Hive Query with UNION ALL and RANK with order使用 UNION ALL 和 RANK 优化 Hive 查询
【发布时间】:2019-04-04 12:42:07
【问题描述】:

当前情景: 我有这个查询,它对两组数据进行联合,然后根据排名选择字段 但是根据我的分析,整个数据集可以在 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

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

【问题讨论】:

    标签: sql hadoop hive query-optimization hiveql


    【解决方案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 都包含在由联合定义的第一个集合中,那么这总是正确的;那么是的,您可以消除工会的第二部分。因为第一组首先包含完整的组。但是,如果这不能保证是真的陈述,那么当前在 a...F 和 P...T 上使用并集的方法会生成“主集”

    【讨论】:

    • 是的。现在,我明白你在说什么了。非常非常感谢您的详细解释。那样的话,UNION也会延长执行时间,union-all更有意义。这个查询现在看起来已经调整得很好了,没有优化的余地。
    • 联合一切都很好。 Union 只会消除每个集合中存在的重复项。但我的观点更多的是丢失定义联合的第二组数据中的记录,如果不是在联合定义的第一组中。
    • 是的,.我还将开始并行查看数据。谢谢你的例子,它真的很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多