sql - 使用 UNION ALL 和 RANK 优化 Hive 查询

标签 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

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

最佳答案

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

Essentially what the query you have does is trust the data from the first set of the union more than the second set of the union. However, if there is an IFC value in the second set not in the first; it must come from the 2nd part of the union; thus removing the second part of the union could remove records.

例子:

  • 假设 unionV.ifc 来自并集两侧的表 AP
  • 假设A & P中有以下数据

.

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 上使用联合的方法会生成“主集”

关于sql - 使用 UNION ALL 和 RANK 优化 Hive 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55516273/

相关文章:

hadoop - 带有ToDate内置函数的PIg- NullPointerException

hadoop - 分解具有多个包含空值的数组列的配置单元表

用于搜索具有特定标签的项目的 MySQL 查询

c# - Fluent LINQ - 选择包含子列表的父列表,其中子子集存在

sql - 如何判断sql表是否是Temporal表?

sql - 如何在 hive 中使用 regexp_extract

shell - 使用Shell脚本发送电子邮件并附加查询的输出

sql - 将 SQL Server 中的列从任意名称重命名为新名称

hadoop - 索引如何在配置单元内部工作?

hadoop - Oozie:子工作流操作:如何检索子工作流 ID?