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 OVERWRITE
比DROP + 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 OVERWRITE
或 DROP
+CREATE
+INSERT
工作得更快,因为它将是单个 Hive-only 命令。
【讨论】:
这也适用于分区吗?如果 auto.purge 设置为 true,当插入覆盖到分区时,该分区的旧数据也不会被移动到垃圾箱? @uptoNoGood 是的,它应该删除被覆盖的分区中的旧数据而不移动到 thrash【参考方案2】:一个优势考虑是,如果您的架构发生更改,INSERT OVERWRITE
将失败,而 DROP
+CREATE
+INSERT
不会。虽然这不太可能适用于大多数场景,但如果您正在对工作流/表架构进行原型设计,那么它可能值得考虑。
【讨论】:
以上是关于HIVE - 插入覆盖与删除表 + 创建表 + 插入的主要内容,如果未能解决你的问题,请参考以下文章