【问题标题】:HIVE Insert overwrite into a partitioned TableHIVE 将覆盖插入到分区表中
【发布时间】:2017-03-01 19:02:58
【问题描述】:

我在分区表上运行了插入覆盖。在命令之后,例如创建以下分区。 a,b,c,d,e

现在,当我重新运行插入覆盖表时,但这次使用的是完全不同的数据集。例如,在第二次插入之后,创建了下面的分区。 f,g,h,i,j

问题-第二次插入的数据是否不会覆盖属于第一次插入的数据。在第二次插入后,我仍然在 HDFS 中看到文件夹 a、b、c、d、e。但是当我通过 HIVE 查询它们时,分区 a、b、c、d、e 没有出现。

这是插入覆盖表的预期行为吗?还是我在这里遗漏了什么?

【问题讨论】:

  • 分享示例插入命令
  • 不,这不是预期的行为。除非您重新创建表,否则您应该理想地看到两个插入的所有分区。

标签: hadoop hive


【解决方案1】:

这很奇怪。我尝试了上述情况,但看到了不同的结果。首先插入覆盖创建了 a,b,c,d,e 分区。也可以通过 SHOW PARTITIONS 命令查看它们,并且能够执行返回数据的选择查询。

然后我做了另一个插入覆盖,它创建了五个新的分区 f、g、h、i、j。当我执行 SHOW PARTITIONS 时,我会看到从 a 到 j 的所有分区。此外,所有分区中的数据都是完整的,并且可以通过 select 语句获取。

下一步,我尝试将数据加载到现有分区中,比如 a,我可以看到数据覆盖了分区中的现有数据。 这是预期的行为。

请分享您用于创建表并将数据加载到其中的语句。

【讨论】:

    【解决方案2】:

    在 hive 中插入覆盖会删除所有现有数据,然后使用您之前创建的分区(当您创建表时)写入新数据。当您创建分区时,它们会添加到配置单元元数据中,但它们会一直保留在那里,直到您删除分区或表。因此,当您“覆盖”表时,这些分区仍然适用于新数据。

    【讨论】:

      【解决方案3】:

      以下是一些示例脚本及其效果。

      假设我们有一个表SOME_TABLE,其中包含三个字段ABC,以及两个分区字段YEARMONTH。 假设我们要删除表中的数据,而不是表的结构。

      1.无分区规范

      如果我们运行

      INSERT OVERWRITE TABLE SOME_TABLE
      PARTITION
      (
           YEAR
          ,MONTH
      )
      SELECT A,B,C,YEAR,MONTH
      FROM SOME_TABLE
      WHERE FALSE
      

      然后查询执行但数据保留在那里。

      2。部分分区规范

      如果我们运行

      INSERT OVERWRITE TABLE SOME_TABLE
      PARTITION
      (
           YEAR=2018
          ,MONTH
      )
      SELECT A,B,C,MONTH
      FROM SOME_TABLE
      WHERE FALSE
      

      然后同样的事情发生:数据保留在那里。

      3.完整的分区规格

      如果我们运行

      INSERT OVERWRITE TABLE SOME_TABLE
      PARTITION
      (
           YEAR=2018
          ,MONTH=11
      )
      SELECT A,B,C
      FROM SOME_TABLE
      WHERE FALSE
      

      只有这样,数据才会被删除,并且仅限于给定的年份和月份。其他分区的数据不会被删除。

      请注意,没有删除任何分区SHOW PARTITIONS SOME_TABLE 返回所有分区,包括在运行INSERT OVERWRITE 之前存在的分区。

      旁注: 我很想知道是否有办法删除所有现有数据,但保留表结构。 DROP TABLE 将删除该结构。 ALTER TABLE ... DROP PARTITION 只会删除目标分区,因此我们必须提前知道每个分区字段的取值范围。在这个例子中,我们可以这样做

      ALTER TABLE SOME_TABLE DROP PARTITION(year>=0,month>0) PURGE;
      

      但它似乎仍然太复杂的解决方案。

      【讨论】:

      • 你找到答案了吗?
      • @Rafa,我有一段时间没有使用 Hive,遗憾的是还没有找到一个优雅的解决方案,可以在保留表结构的同时删除所有现有数据。
      • 你可以truncate table SOME_TABLE;吗?
      • 为什么这不是所提问题的公认答案?作者提出了一些非常有用的观点,并提供了有效的代码供大家查看。
      【解决方案4】:

      您覆盖了表,而不仅仅是一些分区。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-10
        • 1970-01-01
        • 2014-11-27
        • 1970-01-01
        • 2021-11-10
        • 1970-01-01
        • 1970-01-01
        • 2015-10-20
        相关资源
        最近更新 更多