私はHiveでいくつかのクエリの自動スクリプトを実行していますが、テーブルからデータをクリアして新しいデータを挿入する必要があることがわかりました。そして、私たちは何がより速くなるかを考えていますか?
INSERT OVERWRITE TABLE SOME_TABLE
SELECT * FROM OTHER_TABLE;
またはこのようにする方が速いです:
DROP TABLE SOME_TABLE;
CREATE TABLE SOME_TABLE (STUFFS);
INSERT INTO TABLE
SELECT * FROM OTHER_TABLE;
クエリ実行のオーバーヘッドは問題ではありません。作成のためにスクリプトoがあるからです。問題は、数十億行のINSERT OVERWRITE
がDROP + CREATE + INSERT INTO
よりも速いということです。
最高の速度を得るには、1)_hadoop fs -rm -r -skipTrash table_dir/*
_を最初に発行して、ファイルをゴミ箱に入れずに古いデータをすばやく削除することをお勧めします。次に2)_INSERT OVERWRITE
_コマンドを実行します。テーブルを削除/作成する必要がないため、これも高速になります。
更新:
Hive 2.3.0(Hive-15880)以降、テーブルにTBLPROPERTIES ("auto.purge"="true")
がある場合、_INSERT OVERWRITE
_クエリがテーブルに対して実行されても、テーブルの以前のデータはゴミ箱に移動されません。この機能は、管理テーブルにのみ適用されます。したがって、自動パージを使用したINSERT OVERWRITEは、単一のハイブになるため、_rm -skipTrash
_ + _INSERT OVERWRITE
_またはDROP
+ CREATE
+ INSERT
よりも高速に動作します。 -onlyコマンド。
エッジに関する1つの考慮事項は、スキーマが変更された場合にINSERT OVERWRITE
は失敗しますが、DROP
+ CREATE
+ INSERT
は失敗しません。これがほとんどのシナリオに当てはまる可能性は低いですが、ワークフロー/テーブルスキーマのプロトタイプを作成している場合は、検討する価値があります。