hadoop - 插入覆盖本地目录启动 map reduce 作业以进行简单查询

标签 hadoop hive hiveql

我有两个配置单元查询

  1. select * from tab1 limit 3;

    这会快速返回 3 行,而无需启动任何 map reduce 作业;

  2. 如果我要求将输出写入本地目录,则相同的查询

    `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/

相关文章:

eclipse - Hadoop 0.20.2 Eclipse 插件未完全运行 - 不能 'Run on Hadoop'

shell - 使用 Oozie 执行 shell 脚本,作业始终仅处于运行状态

Hadoop:您可以使用一对值作为 "Key"吗?

hadoop - 我们可以在Cloudera Hadoop集群中将hbase.rpc.protection属性值设置为none吗?如果是,那怎么办?

apache - 如何构建 apache HCatalog 0.5.0?

mysql - 将N个数组合并为一个?

java - Hive UDF、Java 基元和 null

hadoop - 数据湖的原始数据层可以包含表吗?

mysql - 编译语句 : FAILED: SemanticException [Error 10036]: Duplicate column name: p_id 时出错

hadoop - 寻找每个赛季得分最高的主队