2017-01-26 99 views
1

我有一個表,stop_logs在HIVE中。當我運行大約6000行的插入查詢時,需要300秒,就像我只運行SELECT查詢一樣,它在6秒鐘內完成。爲什麼插入需要花費這麼多時間?插入HIVE外部表非常慢

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

首先你需要了解蜂巢是如何處理您的查詢:

當你「從<表名>SELECT *」執行,蜂巢從文件作爲的FetchTask,而不是獲取整個數據一個mapreduce任務,它只是將數據原樣轉儲而不做任何事情。這與「hadoop dfs -text」類似。因爲它不運行任何map-reduce任務,所以它運行得更快。

在使用「選擇A,B從<表名>」,蜂巢需要地圖減少的工作,因爲它需要通過從它加載文件解析它來提取從各行的「列」。

在使用「插入表格stop_logs選擇A,B從event_logs」聲明,第一個SELECT語句運行,這觸發因爲它需要從分析它來提取每一行的「列」的map-reduce任務將其加載並插入另一個表(stop_logs)中,它將啓動另一個map reduce任務,以將值插入到'stop_logs'的列a和b中,並分別將它們映射到列a和b,以便插入到新行中。

另一個原因是緩慢檢查「hive.typecheck.on.insert」被設置爲真,因爲該值被驗證,轉換並歸一化,以符合他們的列類型(配置單元0.12.0以後)同時插入到表中也會導致insert與select語句相比執行緩慢。