为简单查询插入覆盖本地目录启动映射reduce作业

时间:2014-02-14 10:49:21

标签: hadoop hive hiveql

我有两个配置单元

  1. select * from tab1 limit 3;

    这会快速返回3行,而不会启动任何地图缩减作业;

  2. 如果我要求将输出写入本地目录

    ,现在是相同的Query
    `INSERT OVERWRITE LOCAL DIRECTORY "/tmp/query1/" select * from tab1 limit 3;
    

    此查询启动了一个map reduce工作,它扫描表中的所有文件,然后返回3行,所讨论的表格很大,因此扫描整个文件需要很长时间。

  3. 为什么两个查询的执行风格都有差异?

1 个答案:

答案 0 :(得分:0)

一个简单的解释是:

当您在Hive中执行简单的select * from tab1 limit 3查询时,它会从HDFS访问原始数据文件,并将输出呈现为基于HDFS中存储的文件的视图dfs -cat 'filepath'。在这种情况下,不会触发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 Jobs,您可以在EXPLAIN关键字之前使用SELECT关键字。这应该让你更清楚。

相关问题