13

我在 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;

运行查询的开销不是问题。由于我们也有创建脚本。问题是,INSERT OVERWRITE十亿行的速度比DROP + CREATE + INSERT INTO

4

2 回答 2

13

为了获得最大速度,我建议 1)hadoop fs -rm -r -skipTrash table_dir/*首先发布快速删除旧数据而不将文件放入垃圾箱的问题,因为 INSERT OVERWRITE 会将所有文件放入垃圾箱,对于非常大的表,这将花费大量时间。然后2)做INSERT OVERWRITE命令。这也会更快,因为您不需要删除/创建表。

更新:

从 Hive 2.3.0 (HIVE-15880) 开始,如果表具有表的先前数据,则在对表运行查询TBLPROPERTIES ("auto.purge"="true")时不会将其移动到垃圾箱。INSERT OVERWRITE此功能仅适用于托管表。因此,带有自动清除功能的 INSERT OVERWRITE将比rm -skipTrash+INSERT OVERWRITEDROP++工作得更快,因为它将是单个 Hive-only 命令。CREATEINSERT

于 2016-09-21T18:25:36.637 回答
5

一个优势考虑是,如果您的架构发生更改,INSERT OVERWRITE将会失败,而DROP++CREATE不会INSERT。虽然这不太可能适用于大多数场景,但如果您正在对工作流/表模式进行原型设计,那么它可能值得考虑。

于 2019-09-13T17:08:10.307 回答