【问题标题】:HIVE - INSERT OVERWRITE vs DROP TABLE + CREATE TABLE + INSERT INTOHIVE - 插入覆盖与删除表 + 创建表 + 插入
【发布时间】: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 会完全删除表和所有旧数据。

标签: hive hiveql create-table hiveddl


【解决方案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 不会。虽然这不太可能适用于大多数场景,但如果您正在对工作流/表架构进行原型设计,那么它可能值得考虑。

【讨论】:

    猜你喜欢
    • 2014-11-27
    • 2017-03-01
    • 1970-01-01
    • 2022-01-17
    • 2015-01-10
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多