假设有两个查询:
select count(distinct a) from x;
select count(*) from (select distinct a from x) y;
我知道它们返回相同的结果,但是从Hive
的角度来看(使用MapReduce
)。谁能解释哪个是更好的选择,为什么?
感谢您的帮助。
答案 0 :(得分:2)
在1.2.0之前的Hive版本中,第一个查询使用一个Map和一个Reduce阶段执行。 Map将每个值发送到单个化简器,化简器完成所有工作。
在这种情况下,单个reducer处理太多数据。
在第二次查询执行期间,映射器输出分布在许多化简器之间,每个化简器生成其不同的列表,最后的map-reduce作业确实汇总了每个列表的大小。
自Hive 1.2.0起,Hive 1.2.0+提供了自动重写优化hive.optimize.distinct.rewrite=true/false
,请参见HIVE-10568
答案 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