HIVE - INSERT OVERWRITE 与 DROP TABLE + CREATE TABLE + INSERT INTO

HIVE - INSERT OVERWRITE vs DROP TABLE + CREATE TABLE + INSERT INTO

我正在 hive 中执行一些查询的自动脚本,我们发现我们需要时不时地清除 table 中的数据并插入新数据。我们正在考虑什么可以更快?

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;

运行 查询的开销不是问题。由于我们也有创建脚本。问题是,拥有十亿行的 INSERT OVERWRITEDROP + CREATE + INSERT INTO?

为了获得最大速度,我建议 1) 首先发布 hadoop fs -rm -r -skipTrash table_dir/* 以快速删除旧数据而不将文件放入垃圾箱,因为 INSERT OVERWRITE 会将所有文件放入垃圾箱并且对于非常大的 table 这会花很多时间。然后 2) 执行 INSERT OVERWRITE 命令。这也会更快,因为您不需要 drop/create table.

更新:

从 Hive 2.3.0 (HIVE-15880) 开始,如果 table 有 TBLPROPERTIES ("auto.purge"="true"),当 INSERT OVERWRITE 查询是 运行 对 table。此功能仅适用于托管 tables。因此,使用自动清除的 INSERT OVERWRITE 将比 rm -skipTrash + INSERT OVERWRITEDROP+CREATE+INSERT 工作得更快,因为它将是一个 Hive-only 命令.

一个优势考虑是,如果您的架构发生变化,INSERT OVERWRITE 将失败,而 DROP+CREATE+INSERT 则不会。虽然这不太可能适用于大多数情况,但如果您正在制作原型 workflow/table 模式,那么它可能值得考虑。