在HIVE外表中插入非常慢

时间:2017-01-26 10:02:35

标签: hive emr

我有一张表,在HIVE中有stop_logs。当我运行大约6000行的插入查询时,需要300秒,就好像我只运行SELECT查询一样,它在6秒内完成。为什么插入花了这么多时间?

CREATE TABLE stop_logs (event STRING, loadId STRING)
STORED AS SEQUENCEFILE;

以下需要300秒:

INSERT INTO TABLE stop_logs 
  SELECT 
    i.event, i.loadId
  FROM 
    event_logs i
  WHERE 
    i.stopId IS NOT NULL;
;

以下查询需要6秒。

 SELECT 
    i.event, i.loadId
  FROM 
    event_logs i
  WHERE 
    i.stopId IS NOT NULL;
;

1 个答案:

答案 0 :(得分:3)

首先,您需要了解Hive如何处理您的查询:

当你执行“ select * from< tablename> ”时,Hive会将整个数据从文件中取出作为FetchTask而不是mapreduce任务,它只是按原样转储数据而不做任何事情在上面。这类似于“hadoop dfs -text”。因为它没有运行任何map-reduce任务所以它运行得更快。

在使用“从a< tablename>”中选择a,b时,Hive需要map-reduce作业,因为它需要通过从文件中解析来从每行中提取“列”负载。

使用“插入表stop_logs从事件_logs”语句中选择a,b时,首先选择语句运行,这会触发map-reduce作业,因为它需要从每行中提取“列”从它加载的文件解析它并插入另一个表(stop_logs)它将启动另一个map reduce任务,将值插入'stop_logs'中的a和b列,并分别映射到a和b列,以便插入新的一行。

缓慢的另一个原因是检查如果“ hive.typecheck.on.insert ”设置为true,因为该值已经过验证,转换和规范化以符合其列类型(Hive 0.12)插入表时,与select语句相比,插入执行速度慢。