我有两个配置单元查询
select * from tab1 limit 3;
这会快速返回 3 行,而无需启动任何 map reduce 作业;
如果我要求将输出写入本地目录,则相同的查询
`INSERT OVERWRITE LOCAL DIRECTORY "/tmp/query1/" select * from tab1 limit 3;
此查询启动一个 map reduce 作业,扫描表的所有文件,然后返回 3 行,所讨论的表很大,因此扫描整个表需要很长时间。
<
为什么两个查询的执行方式不同?
最佳答案
一个简单的解释是:
当您在 Hive 中执行一个简单的 select * from tab1 limit 3
查询时,它会访问来自 HDFS 的原始数据文件,并在存储在 HDFS 中的文件之上以 View 的形式呈现输出dfs -cat '文件路径'
。在这种情况下不会触发 Map Reduce 作业,因此可以更快地完成作业。如果您将查询修改为甚至拉取列,如 select col1 from tab1 limit 3
,则会触发 Map Reduce 作业并扫描部分文件以并行拉取结果,从而消耗一些累积 CPU 时间。
当您点击类似INSERT OVERWRITE LOCAL DIRECTORY "/tmp/query1/"select * from tab1 limit 3;
为了了解有关 Hive 如何将查询转换为 Map Reduce 作业的更多信息,您可以在 SELECT
关键字之前使用 EXPLAIN
关键字。这应该会让您更清楚。
关于hadoop - 插入覆盖本地目录启动 map reduce 作业以进行简单查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21777280/