我有一张表,在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;
;
答案 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语句相比,插入执行速度慢。