在 Hive 中,哪个查询更好,为什么?
In Hive, which query is better and why?
假设有两个查询:
select count(distinct a) from x;
select count(*) from (select distinct a from x) y;
我知道他们return结果一样,但是从Hive
的角度来看(使用MapReduce
)。谁能解释一下哪个是更好的选择,为什么?
感谢任何帮助。
在 1.2.0 之前的 Hive 版本中,第一个查询使用一个 Map 和一个 Reduce 阶段执行。 Map 将每个值发送到单个 reducer,reducer 完成所有工作。
在这种情况下,单个减速器处理的数据过多。
在第二次查询执行期间,mappers 输出分布在许多 reducer 之间,每个 reducer 生成其不同的列表,最终的 map-reduce 作业会汇总每个列表的大小。
由于 Hive 1.2.0 Hive 1.2.0+ 提供了自动重写优化hive.optimize.distinct.rewrite=true/false
,参见HIVE-10568
第二个查询:select count(*) from (select distinct a from x) y;
比
快 3.x
第一个查询:select count(distinct a) from x;
请参考
https://issues.apache.org/jira/browse/HIVE-10568
在 Hive 中执行了两个查询,第一个查询在 1 个阶段用 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
第二个查询分 2 个阶段执行,提高了并行性。
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
假设有两个查询:
select count(distinct a) from x;
select count(*) from (select distinct a from x) y;
我知道他们return结果一样,但是从Hive
的角度来看(使用MapReduce
)。谁能解释一下哪个是更好的选择,为什么?
感谢任何帮助。
在 1.2.0 之前的 Hive 版本中,第一个查询使用一个 Map 和一个 Reduce 阶段执行。 Map 将每个值发送到单个 reducer,reducer 完成所有工作。
在这种情况下,单个减速器处理的数据过多。
在第二次查询执行期间,mappers 输出分布在许多 reducer 之间,每个 reducer 生成其不同的列表,最终的 map-reduce 作业会汇总每个列表的大小。
由于 Hive 1.2.0 Hive 1.2.0+ 提供了自动重写优化hive.optimize.distinct.rewrite=true/false
,参见HIVE-10568
第二个查询:select count(*) from (select distinct a from x) y;
比
快 3.x第一个查询:select count(distinct a) from x;
请参考 https://issues.apache.org/jira/browse/HIVE-10568
在 Hive 中执行了两个查询,第一个查询在 1 个阶段用 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
第二个查询分 2 个阶段执行,提高了并行性。
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