Hive 在配置单元外部表中插入非常慢

Hive 在配置单元外部表中插入非常慢,hive,emr,Hive,Emr,我有一张桌子,停在蜂箱里。当我运行大约6000行的insert查询时,需要300秒,就像运行SELECT查询一样,它只需6秒钟就完成了。为什么insert要花这么多时间 CREATE TABLE stop_logs (event STRING, loadId STRING) STORED AS SEQUENCEFILE; 以下时间为300秒: INSERT INTO TABLE stop_logs SELECT i.event, i.loadId FROM eve

我有一张桌子,停在蜂箱里。当我运行大约6000行的insert查询时,需要300秒,就像运行SELECT查询一样,它只需6秒钟就完成了。为什么insert要花这么多时间

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;
;

首先,您需要了解配置单元是如何处理查询的:

当您执行“select*from”时,Hive将整个数据作为一个FetchTask从文件中提取,而不是mapreduce任务,它只是按原样转储数据,而不对数据执行任何操作。这类似于“hadoop dfs-text”。因为它不运行任何map reduce任务,所以它运行得更快

使用“从中选择a、b”时,配置单元需要map reduce作业,因为它需要通过从加载的文件中解析“列”来从每一行中提取“列”

使用“插入表停止日志从事件日志中选择a、b”语句时,会运行first select语句,这会触发map REDUCT作业,因为它需要通过从加载的文件中解析“列”来从每行提取“列”,并插入到另一个表(停止日志)它将启动另一个map reduce任务,以获取插入“stop_logs”中a列和b列的值,并将它们分别映射到a列和b列,以插入新行

缓慢的另一个原因是检查“hive.typecheck.on.insert”是否设置为true,因为值在插入到表中时会被验证、转换和规范化,以符合它们的列类型(hive 0.12.0以后),这也会导致insert与select语句相比执行缓慢