2017-01-26 24 views
1

テーブルがあり、HIVEにstop_logsがあります。 6000行程度の挿入クエリを実行すると、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

まずあなたはハイブは、クエリの処理方法を理解する必要があります:あなたは「<テーブル名>から選択*」を実行すると

を、ハイブはFetchTaskとしてファイルからではなく、全体のデータをフェッチその上に何もせずにそのままデータをダンプするmapreduceタスクです。これは "hadoop dfs -text"と似ています。 map-reduceタスクは実行されないため、より速く実行されます。

「<テーブル名>から、Bを選択し、」を使用しながら、それがロードファイルからそれを解析して、各行の「列」を抽出する必要があるため、ハイブはマップ減らすジョブを必要とします。それから、それを解析して、各行の「列」を抽出する必要があるため

を使用している間ステートメント、MAP-減らすジョブをトリガする第1の選択ステートメントの実行を、「表stop_logs挿入がevent_logsから、Bを選択して」それがロードされ、別のテーブル(stop_logs)に挿入するために別のマップ削減タスクを起動するために、 'stop_logs'のカラムaとbに挿入された値を取り、カラムaとbにマッピングして新しいローに挿入します。

遅いための別の理由は、その値の検証されたので、「hive.typecheck.on.insertが」trueに設定されているかどうかを確認している(以降ハイブ0.12.0)に変換し、それらの列タイプに適合するように正規化表に挿入すると、select文と比較して遅いinsertも実行されます。

関連する問題