HIVE - 插入覆盖与删除表 + 创建表 + 插入

Posted

技术标签:

【中文标题】HIVE - 插入覆盖与删除表 + 创建表 + 插入【英文标题】:HIVE - INSERT OVERWRITE vs DROP TABLE + CREATE TABLE + INSERT INTO 【发布时间】:2017-01-29 19:49:50 【问题描述】:

我在 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 OVERWRITEDROP + CREATE + INSERT INTO 快​​吗?

【问题讨论】:

Insert OVERWRITE 确保从 HDFS 中删除了以前的数据,并且只有新数据在表/分区中可用。 DROP + CREATE + INSERT INTO 可能不保证相同。 @Ambrish 为什么/你能提供来源吗?我会假设 drop table 会完全删除表和所有旧数据。 【参考方案1】:

为了获得最大速度,我建议 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+CREATE+INSERT 工作得更快,因为它将是单个 Hive-only 命令。

【讨论】:

这也适用于分区吗?如果 auto.purge 设置为 true,当插入覆盖到分区时,该分区的旧数据也不会被移动到垃圾箱? @uptoNoGood 是的,它应该删除被覆盖的分区中的旧数据而不移动到 thrash【参考方案2】:

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

【讨论】:

以上是关于HIVE - 插入覆盖与删除表 + 创建表 + 插入的主要内容,如果未能解决你的问题,请参考以下文章

Hive 插入覆盖表

hadoop中hive下怎么插入一条数据到一个表里面?

PostgreSQl的分区表创建,插入数据,查询

Hive基础知识

hive中表的创建和对表数据的操作

Java 3:顺序表的操作