举个简单的例子,
select * from tablename;
不打开地图缩小,而
select count(*) from tablename;
DOES。用于决定何时使用map reduce(通过hive)的一般原则是什么?
答案 0 :(得分:8)
通常,任何类型的聚合(例如最小/最大/计数)都需要MapReduce作业。这可能不会为你解释一切。
Hive,以许多RDBMS的风格,有一个EXPLAIN
关键字,它将概述您的Hive查询如何转换为MapReduce作业。尝试在两个示例查询上运行解释,看看它在幕后尝试做什么。
答案 1 :(得分:4)
每当我们触发 select * from tablename 之类的查询时,Hive会读取数据文件并获取整个数据而不进行任何聚合(最小/最大/计数等)。 )。它会调用 FetchTask 而不是 mapreduce 任务。
这也是Hive中的优化技术。 hive.fetch.task.conversion 属性可以(即FETCH任务)最小化map-reduce开销的延迟。
这就像我们正在阅读一个hadoop文件: hadoop fs -cat filename
但是,如果我们使用从tablename 中选择colNames,则需要map-reduce作业,因为它需要提取'列'从每行开始,从它加载的文件中解析它。
答案 2 :(得分:1)
从tablename中选择*;
只需从HDFS中的文件中读取原始数据,因此没有MapReduce就会快得多。
答案 3 :(得分:-1)
这是一种优化技术,hive.fetch.task.conversion
属性可以(FETCH)任务最小化mapreduce开销的延迟。
在执行SELECT,LIMIT,FETCH查询时,此属性会跳过mapreduce并使用FETCH任务。
此属性可以有3个值 - none
,minimal
(默认值)和more
。