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

vtwuwzda  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(522)

我有一张table,在Hive里停下来。当我运行一个大约6000行的insert查询时,需要300秒,就像我运行just 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;
;
qyzbxkaa

qyzbxkaa1#

首先,您需要了解配置单元是如何处理查询的:
当您执行“select*from时,hive将整个数据作为fetchtask而不是mapreduce任务从文件中提取,mapreduce任务只是按原样转储数据而不对其执行任何操作。这类似于“hadoop dfs-text”。因为它不运行任何map reduce任务,所以它运行得更快。
使用“select a,b from”时,hive需要map reduce作业,因为它需要从加载的文件中解析每一行的“column”。
在使用“insert into table stop\u logs select a,b from event\u logs”语句时,首先运行select语句,这触发了map reduce作业,因为它需要通过从加载的文件中解析来从每一行提取“列”,并且为了插入到另一个表(stop\u logs)中,它将启动另一个map reduce任务,以获取插入到“stop\u logs”中的列a和b中的值,并将它们分别Map到列a和b中,以便插入新行。
慢的另一个原因是检查“hive.typecheck.on.insert”是否设置为true,因为在插入到表中时,值会被验证、转换和规范化,以符合它们的列类型(hive 0.12.0以后),这也会导致insert作为compare to select语句执行慢。

相关问题