sql - 优化长时间运行的Hive SQL查询-具有与同一表的联接

标签 sql hadoop hive apache-tez

以下查询需要大量时间才能执行。它与tez执行引擎一起运行。

SELECT STG.EMP_TYPE, DEPT, A.TOTAL_COUNT, COUNT(DISTINCT EMP_ID) AS COUNT_DEPT
FROM 
STAGE_SOURCE STG 
LEFT OUTER JOIN 
( SELECT EMP_TYPE, COUNT(DISTINCT EMP_ID) AS TOTAL_COUNT 
  FROM STAGE_SOURCE 
  GROUP BY EMP_TYPE 
) A
ON STG.EMP_TYPE = A.EMP_TYPE
GROUP BY STG.EMP_TYPE, DEPT, A.TOTAL_COUNT;

是否有任何可以提高查询性能的重写选项或优化策略?

最佳答案

通过理解您的查询,我能够理解您需要计数2个值。
首先,每个EMP_TYPE下的EMP_ID计数,
其次。 DEPT和EMP_TYPE下的EMP_ID计数

SELECT 

STG.EMP_TYPE, 
DEPT,
TOTAL_COUNT, 
COUNT(EMP_ID) AS COUNT_DEPT

FROM 
STAGE_SOURCE STG 
JOIN 
( SELECT EMP_TYPE, COUNT(EMP_ID) AS TOTAL_COUNT 
  FROM STAGE_SOURCE 
  GROUP BY EMP_TYPE 
) A
ON STG.EMP_TYPE = A.EMP_TYPE
GROUP BY STG.EMP_TYPE, DEPT,TOTAL_COUNT;

尽可能使用GROUP BY代替DISTINCT可以减少运行时间。
如上面“考虑我”所述,GROUP BY利用了索引的优势。

关于sql - 优化长时间运行的Hive SQL查询-具有与同一表的联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34256123/

相关文章:

java - @Column 长度大于 255 个字符的实体

MySQL:将一个文件的数据插入到两张表中,一张带有auto_increment id,一张连接表

docker - spark-submit如何在群集模式下传递--driver-class-path?

java - 是否可以使用java将数据附加到hdfs

windows - Hadoop start-all.cmd 命令 : datanode shutting down

hbase - 加入映射到 HBase 的 Hive 表

mysql - 如何修复 mySQL 查询以查找与每个日期的总计数(包括零)映射的所有月份日期?

sql - PL/pgSQL 中的 %% 是什么意思?

hadoop - 在 hive 仓库中归档

hadoop - hive 删除表不起作用