在Hive中,哪个查询更好,为什么?

时间:2018-07-24 03:00:44

标签: hive mapreduce

假设有两个查询:

  1. select count(distinct a) from x;

  2. select count(*) from (select distinct a from x) y;

我知道它们返回相同的结果,但是从Hive的角度来看(使用MapReduce)。谁能解释哪个是更好的选择,为什么?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

在1.2.0之前的Hive版本中,第一个查询使用一个Map和一个Reduce阶段执行。 Map将每个值发送到单个化简器,化简器完成所有工作。 count(distinct)

在这种情况下,单个reducer处理太多数据。

在第二次查询执行期间,映射器输出分布在许多化简器之间,每个化简器生成其不同的列表,最后的map-reduce作业确实汇总了每个列表的大小。 count(*) from (select distinct)

自Hive 1.2.0起,Hive 1.2.0+提供了自动重写优化hive.optimize.distinct.rewrite=true/false,请参见HIVE-10568

另请参阅Hortonworks community

答案 1 :(得分:2)

第二个查询:从(从x中选择a)选择count(*)y;

快3.x

第一个查询:从x中选择count(distinct a);

请参阅 https://issues.apache.org/jira/browse/HIVE-10568

在Hive中执行了两个查询,第一个查询是在1个reducer的情况下分阶段执行的。

MapReduce Jobs Launched: Stage-Stage-1: Map: 3 Reduce: 1 Cumulative CPU: 46.51 sec HDFS Read: 42857 HDFS Write: 4 SUCCESS Total MapReduce CPU Time Spent: 46 seconds 510 msec

第二个查询分两个阶段执行,并提高了并行性。

MapReduce Jobs Launched: Stage-Stage-1: Map: 3 Reduce: 1 Cumulative CPU: 13.93 sec HDFS Read: 42857 HDFS Write: 115 SUCCESS Stage-Stage-2: Map: 1 Reduce: 1 Cumulative CPU: 5.83 sec HDFS Read: 510 HDFS Write: 4 SUCCESS Total MapReduce CPU Time Spent: 19 seconds 760 msec