【发布时间】:2011-11-19 22:55:23
【问题描述】:
举个简单的例子,
select * from tablename;
不启动 map reduce,而
select count(*) from tablename;
确实如此。决定何时使用 map reduce(通过 hive)的一般原则是什么?
【问题讨论】:
举个简单的例子,
select * from tablename;
不启动 map reduce,而
select count(*) from tablename;
确实如此。决定何时使用 map reduce(通过 hive)的一般原则是什么?
【问题讨论】:
一般来说,任何类型的聚合,例如 min/max/count 都需要 MapReduce 作业。这可能无法为您解释一切。
Hive 具有许多 RDBMS 的风格,有一个 EXPLAIN 关键字,它将概述如何将 Hive 查询转换为 MapReduce 作业。尝试对您的两个示例查询运行解释,看看它在幕后试图做什么。
【讨论】:
从表名中选择 *;
只是从 HDFS 中的文件中读取原始数据,因此在没有 MapReduce 的情况下要快得多。
【讨论】:
这是一种优化技术,hive.fetch.task.conversion 属性可以 (FETCH) 任务最小化 mapreduce 开销的延迟。
在执行 SELECT、LIMIT、FETCH 查询时,此属性会跳过 mapreduce 并使用 FETCH 任务。
此属性可以有 3 个值 - none、minimal(默认值)和 more。
【讨论】:
每当我们触发像 select * from tablename 这样的查询时,Hive 都会读取数据文件并获取整个数据而不进行任何聚合(最小/最大/计数等)。 )。它会调用 FetchTask 而不是 mapreduce 任务。
这也是 Hive 中的一种优化技术。 hive.fetch.task.conversion 属性可以(即 FETCH 任务)最小化 map-reduce 开销的延迟。
这就像我们正在读取一个 hadoop 文件:hadoop fs -cat 文件名
但如果我们使用 select colNames from tablename,它需要一个 map-reduce 作业,因为它需要通过从加载的文件中解析每行的“列”来提取它。
【讨论】:
select column from tablename 不会在 minimal 或 more 设置为 hive.fetch.task.conversion 时运行 MR