我有一张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;
;
1条答案
按热度按时间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语句执行慢。